两个操作要么同时成功,要么同时失败;
事务的一致性;
以前学ssh ssm都有事务管理service层通过applicationContext.xml配置,所有service方法都加上事务操作;

用来保证一致性,即service方法里的多个dao操作,要么同时成功,要么同时失败;

下面模拟用户转账,a用户转账给b用户200元;需要事务管理;
项目结构:
 
1.代码:                    
com.cy.entity.Account.java;
  1. package com.cy.entity;
  2.  
  3. import javax.persistence.Column;
  4. import javax.persistence.Entity;
  5. import javax.persistence.GeneratedValue;
  6. import javax.persistence.Id;
  7. import javax.persistence.Table;
  8.  
  9. /**
  10. * 账户实体
  11. * @author CY
  12. *
  13. */
  14. @Entity
  15. @Table(name="t_account")
  16. public class Account {
  17.  
  18. @Id
  19. @GeneratedValue
  20. private Integer id;
  21.  
  22. @Column(length=50)
  23. private String userName;
  24.  
  25. private float balance; //余额
  26.  
  27. public Integer getId() {
  28. return id;
  29. }
  30.  
  31. public void setId(Integer id) {
  32. this.id = id;
  33. }
  34.  
  35. public String getUserName() {
  36. return userName;
  37. }
  38.  
  39. public void setUserName(String userName) {
  40. this.userName = userName;
  41. }
  42.  
  43. public float getBalance() {
  44. return balance;
  45. }
  46.  
  47. public void setBalance(float balance) {
  48. this.balance = balance;
  49. }
  50.  
  51. }

账户dao接口:com.cy.dao.AccountDao.java:

  1. package com.cy.dao;
  2.  
  3. import org.springframework.data.jpa.repository.JpaRepository;
  4. import com.cy.entity.Account;
  5.  
  6. /**
  7. * 账户Dao接口
  8. * JpaRepository<T, ID>第二个参数是主键类型
  9. * @author CY
  10. *
  11. */
  12. public interface AccountDao extends JpaRepository<Account, Integer>{
  13.  
  14. }

账户service接口:com.cy.service.AccountService.java:

  1. package com.cy.service;
  2.  
  3. /**
  4. * 账户Service接口
  5. * @author CY
  6. *
  7. */
  8. public interface AccountService {
  9.  
  10. /**
  11. * 从fromUser转账到toUser,account钱;
  12. * @param fromUser
  13. * @param toUser
  14. * @param account
  15. */
  16. public void transferAccounts(int fromUser, int toUser, float account);
  17. }

账户接口实现类:com.cy.service.impl.AccountServiceImpl.java;

  1. package com.cy.service.impl;
  2.  
  3. import javax.annotation.Resource;
  4. import javax.transaction.Transactional;
  5. import org.springframework.stereotype.Service;
  6. import com.cy.dao.AccountDao;
  7. import com.cy.entity.Account;
  8. import com.cy.service.AccountService;
  9.  
  10. /**
  11. * 账户service实现类
  12. * @author CY
  13. *
  14. */
  15. @Service("accountService")
  16. public class AccountServiceImpl implements AccountService{
  17.  
  18. @Resource
  19. private AccountDao accountDao;
  20.  
  21. /**
  22. * 从A用户转账到B用户account元;
  23. * 也就是两个操作:
  24. * A用户减去accout元,B用户加上account元
  25. */
  26. @Override
  27. @Transactional
  28. public void transferAccounts(int fromUser, int toUser, float account) {
  29. Account a = accountDao.getOne(fromUser);
  30. a.setBalance(a.getBalance() - account);
  31. accountDao.save(a);
  32.  
  33. Account b = accountDao.getOne(toUser);
  34. b.setBalance(b.getBalance() + account);
  35. int i = 1/0; //这里制造个异常
  36. accountDao.save(b);
  37. }
  38.  
  39. }

com.cy.controller.AccountController.java来模拟用户转账:

这里返回json数据格式,成功ok,失败no

  1. package com.cy.controller;
  2.  
  3. import javax.annotation.Resource;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. import org.springframework.web.bind.annotation.RestController;
  6. import com.cy.service.AccountService;
  7.  
  8. /**
  9. * 账户Controller层
  10. * @author CY
  11. *
  12. */
  13. @RestController
  14. @RequestMapping("/account")
  15. public class AccountController {
  16.  
  17. @Resource
  18. private AccountService accountService;
  19.  
  20. @RequestMapping("/transfer")
  21. public String transferAccount(){
  22. try{
  23. accountService.transferAccounts(1, 2, 200);
  24. return "ok";
  25. }catch(Exception e){
  26. return "no";
  27. }
  28. }
  29. }

2.测试:

启动项目,查看新建的表t_account:

  1. mysql> desc t_account;
  2. +-----------+-------------+------+-----+---------+----------------+
  3. | Field | Type | Null | Key | Default | Extra |
  4. +-----------+-------------+------+-----+---------+----------------+
  5. | id | int(11) | NO | PRI | NULL | auto_increment |
  6. | balance | float | NO | | NULL | |
  7. | user_name | varchar(50) | YES | | NULL | |
  8. +-----------+-------------+------+-----+---------+----------------+

弄点数据:

  1. mysql> select * from t_account;
  2. +----+---------+-----------+
  3. | id | balance | user_name |
  4. +----+---------+-----------+
  5. | 1 | 700 | zhangsan |
  6. | 2 | 300 | lisi |
  7. +----+---------+-----------+

浏览器http://localhost/account/transfer:

1)显示no,说明转账失败;

2)数据库数据,zhangsan仍然是700,lisi仍然是300,保证了数据一致性;

查看发出的sql:

  1. Hibernate: select account0_.id as id1_0_0_, account0_.balance as balance2_0_0_, account0_.user_name as user_nam3_0_0_ from t_account account0_ where account0_.id=?
  2. Hibernate: select account0_.id as id1_0_0_, account0_.balance as balance2_0_0_, account0_.user_name as user_nam3_0_0_ from t_account account0_ where account0_.id=?
没有执行保存,全部弄完了才保存;

说明:

这里使用的是:import javax.transaction.Transactional;(这个是jpa规范)
使用import org.springframework.transaction.annotation.Transactional也行;(这个spring实现了jpa规范)

spring boot学习(6) SpringBoot 之事务管理的更多相关文章

  1. Spring Boot学习——数据库操作及事务管理

    本文讲解使用Spring-Data-Jpa操作数据库. JPA定义了一系列对象持久化的标准. 一.在项目中使用Spring-Data-Jpa 1. 配置文件application.properties ...

  2. spring boot中的声明式事务管理及编程式事务管理

    这几天在做一个功能,具体的情况是这样的: 项目中原有的几个功能模块中有数据上报的功能,现在需要在这几个功能模块的上报之后生成一条消息记录,然后入库,在写个接口供前台来拉取消息记录. 看到这个需求,首先 ...

  3. spring框架学习笔记7:事务管理及案例

    Spring提供了一套管理项目中的事务的机制 以前写过一篇简单的介绍事务的随笔:http://www.cnblogs.com/xuyiqing/p/8430214.html 还有一篇Hibernate ...

  4. spring boot学习(十三)SpringBoot缓存(EhCache 2.x 篇)

    SpringBoot 缓存(EhCache 2.x 篇) SpringBoot 缓存 在 Spring Boot中,通过@EnableCaching注解自动化配置合适的缓存管理器(CacheManag ...

  5. spring boot 学习(五)SpringBoot+MyBatis(XML)+Druid

    SpringBoot+MyBatis(xml)+Druid 前言 springboot集成了springJDBC与JPA,但是没有集成mybatis,所以想要使用mybatis就要自己去集成. 主要是 ...

  6. spring boot 学习(十)SpringBoot配置发送Email

    SpringBoot配置发送Email 引入依赖 在 pom.xml 文件中引入邮件配置: <dependency> <groupId>org.springframework. ...

  7. spring boot学习(4) SpringBoot 之Spring Data Jpa 支持(1)

    第一节:Spring Data Jpa 简介 Spring-Data-Jpa JPA(Java Persistence API)定义了一系列对象持久化的标准,目前实现这一规范的产品有Hibernate ...

  8. spring boot学习(2) SpringBoot 项目属性配置

    第一节:项目内置属性 application.properties配置整个项目的,相当于以前的web.xml: 注意到上一节的访问HelloWorld时,项目路径也没有加:直接是http://loca ...

  9. 【Spring Boot学习之五】切面日志管理

    环境 eclipse 4.7 jdk 1.8 Spring Boot 1.5.2 一.log4j 常见方式:log4j.properties + org.apache.log4j.Logger比如:l ...

随机推荐

  1. 开发工具之play framework

    Play!是一个full-stack(全栈的)Java Web应用框架,包括一个简单的无   状态MVC模型,具有Hibernate的对象持续,一个基于Groovy的模板引擎,以及建立一个现代Web应 ...

  2. [转载]oracle游标概念讲解

    原文URL:http://www.2cto.com/database/201203/122387.html ORACLE游标概念讲解 什么是游标?  ①从表中检索出结果集,从中每次指向一条记录进行交互 ...

  3. java maven 安装

    1.java环境安装 maven 想要安装 Apache Maven 在Windows 系统上, 需要下载 Maven 的 zip 文件,并将其解压到你想安装的目录,并配置 Windows 环境变量. ...

  4. mongo长连接

    php mongoclient默认都是长连接 mongo close方法可以关闭长连接 redis,mysql 短连接和长连接可选 他们的close方法都不可以关闭长连接

  5. git stash,git cherry-pick

    git stash: 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致.同时,将当前的工作区内容保存到Git栈中.git stash pop: 从Git栈中读取 ...

  6. PNotes – 目前最优秀的桌面便签软件 - imsoft.cnblogs

    Pnotes: 下载链接: http://pan.baidu.com/s/1o6FK4SM 密码: n7il 便携版,包含中文语音包,包含十几种合适的皮肤. 更多信息:小众软件 http://www. ...

  7. linux中文件上传下载

    windows篇 linux文件下载到windows sz命令 登录到linux服务器使用 sz log.log 命令,弹出对话框选择下载文件的目录,点击确定即可. windows文件上传到linux ...

  8. su:鉴定故障

    deepin中从普通用户切换到管理员时出现su:鉴定故障 使用命令:su root [mylinux@localhost ~]$ su root 密码: su: 鉴定故障 解决方法: 使用命令:sud ...

  9. Spring如何解析XML文件——Spring源码之XML初解析

    首先,在我的这篇博客中已经说到容器是怎么初步实现的,并且要使用XmlBeanDefinitionReader对象对Xml文件进行解析,那么Xml文件是如何进行解析的,将在这片博客中进行一些陈述. 数据 ...

  10. HDU 2089:不要62

    Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer). 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来 ...