在后端代码中,如果需要进行多次的数据库修改,通常会加@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,再通过事务管理器进行事务提交或者回滚。
回滚事务
提交事务