Spring事务

在后端代码中,如果需要进行多次的数据库修改,通常会加@Transactional注解,但是spring是如何通过这个注解完成事务的控制和传播呢? 

上面代码通过两个方法调用演示,查看spring如何进行事务控制。 

1.通过TransactionAspectSupport.invokeWithinTransaction方法开始,忽略前置的获取事务属性以及事务管理器步骤。

 

2.获取事务详情 

3.在这里进行判断事务的传播方式,具体的几种方式见TransactionDefinition

 

传播方式指: A 方法调用 B,B的事务如何在A中传播,是加入到A中的事务,还是不加入。  

 这里获取事务,resource是一个ThreadLocal,key是datasource,因此保证了单个线程同一个数据源,如果A中有事务,可以以A事务来执行。保证事务的传播特性。

 

4.启动事务,通过下面代码可以知道,spring通过关闭conn连接对象的自动提交,来实现自己的事务控制。

 

5.执行目标方法,如果发生异常,并且是指定回滚的异常才会回滚,同样回滚也是用的conn对象,提交也是同样方式

目标方法又采用了编程式事务的方式,看看在myUpdate存在事务的情况下,如果加入到这个事务中去。主要是dataSourceTransactionManager.getTransaction()方法

 在getTransaction中取,因为刚才myUpdate已经创建,所以直接拿到。后面再执行业务方法,手动回滚或提交。

下面是完成 myUpdate的注解方式的事务,其实注解方式和编程方式步骤都相同,都是获取事务管理器,再去通过事务定义获取到TransactionStatus,再通过事务管理器进行事务提交或者回滚。

 回滚事务

 提交事务

 

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值