spring事务详解(二)简单样例
2018-09-26 17:53
716 查看
系列目录
spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高一、引子
在Spring中,事务有两种实现方式: 编程式事务管理: 编程式事务管理使用底层源码可实现更细粒度的事务控制。spring推荐使用TransactionTemplate,典型的模板模式。 申明式事务管理: 添加@Transactional注解,并定义传播机制+回滚策略。基于Spring AOP实现,本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。二、简单样例
需求:
创建用户时,新建一个用户余额表。如果用户余额创建失败抛出异常,那么用户表也回滚,即要保证“新增用户+新增用户余额”一起成功 或 回滚。2.1 申明式事务管理
如下图,只需要在service.impl层,业务方法上添加@Transactional注解,定义事务的传播机制为REQUIRED(不写这个参数,默认就是REQUIRED),遇到Exception异常就一起回滚。 REQUIRED传播机制下:存在加入事务,不存在创建新事务。保证了当前方法中的所有数据库操作都在一个物理事务中,当遇到异常时会整个业务方法一起回滚。/** * 创建用户并创建账户余额 * * @param name * @param balance * @return */ @Transactional(propagation= Propagation.REQUIRED, rollbackFor = Exception.class) @Override public void addUserBalanceAndUser(String name, BigDecimal balance) { log.info("[addUserBalanceAndUser] begin!!!"); //1.新增用户 userService.addUser(name); //2.新增用户余额 UserBalance userBalance = new UserBalance(); userBalance.setName(name); userBalance.setBalance(new BigDecimal(1000)); this.addUserBalance(userBalance); log.info("[addUserBalanceAndUser] end!!!"); }
2.2 编程式事务管理
编程式事务管理,我们使用Spring推荐的transactionTemplate。我这里因为使用的是spring cloud的注解配置,实现用了自动配置类配置好了TransactionTemplate这个类型的bean.使用的时候直接注入bean使用即可(当然老式的xml配置也是一样的)。如下:/** * 创建用户并创建账户余额(手动事务,不带结果) * * @param name * @param balance * @return */ @Override public void addUserBalanceAndUserWithinTT(String name, BigDecimal balance) { //实现一个没有返回值的事务回调 transactionTemplate.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus status) { try { log.info("[addUserBalanceAndUser] begin!!!"); //1.新增用户 userService.addUser(name); //2.新增用户余额 UserBalance userBalance = new UserBalance(); userBalance.setName(name); userBalance.setBalance(new BigDecimal(1000)); userBalanceRepository.insert(userBalance); log.info("[addUserBalanceAndUser] end!!!"); //注意:这里catch住异常后,设置setRollbackOnly,否则事务不会滚。当然如果不需要自行处理异常,就不要catch了 } catch (Exception e) { // 异常回滚 status.setRollbackOnly(); log.error("异常回滚!,e={}",e); } } }); }注意: 1.可以不用try catch,transactionTemplate.execute自己会捕捉异常并回滚。--》推荐 2.如果有业务异常需要特殊处理,记得:status.setRollbackOnly(); 标识为回滚。--》特殊情况才使用
三、总结
spring支持的这两种方式都可以,个人认为大部分情况下@Transactional可以满足需要。相关文章推荐
- 详解spring事务属性
- Spring事务传播机制详解
- Spring中事务的传播属性详解
- spring事务详解
- 详解spring事务属性
- Spring事务配置及事务的传播性与隔离级别详解
- spring的事务处理详解[原blog转载]
- 详解spring事务属性
- spring事务详解及配置、实例
- Spring事务Transaction配置的五种注入方式详解
- Spring+hibernate事务详解
- Spring 事务的配置和使用详解(包括手动对事务的控制部分)
- 详解spring事务属性
- Spring、Spring事务详解;使用XML配置事务
- 对Spring事务配置的简单解释
- spring 事务配置例子详解
- spring 嵌套事务 详解
- [置顶] Spring事务详解
- Spring 事务机制详解(事务的隔离性和传播性)
- 详解spring事务属性