Spring事务
2022-06-30 13:48:21 0 举报
Spring源码事务
作者其他创作
大纲/内容
TransactionSynchronizationManager中包括了很多ThreadLocal,用来记录当前线程中事务的各种信息,比如事务的名字、事务对象、事务的隔离级别等,所以我们也可以通过TransactionSynchronizationManager在业务代码中来获取事务的一些状态
PROPAGATION_NOT_SUPPROTED如果当前存在事务,则把当前的事务挂起,然后以非事务的方式运行
判断传播机制
其他
创建事务成功后执行业务方法
事务挂起就是把事务的连接对象、同步器,事务名字,隔离级别记录到SuspendedResourcesHolder对象中去,并把TransactionSynchronizationManager中的信息全部清空,清空是为了用来记录下一个事务的信息
如果执行业务方法没有异常,那么则会执行完finally中的方法再进行提交
如果执行业务方法出现异常,则会进行回滚,然后执行完finally中的方法后再将异常抛出
创建TransactionStatus对象子流程
如果事务对象中没有持有数据库连接对象,那么则调用DataSouce获取一个数据库连接对象,并设置到事务对象中去
会把当前事务的一些信息设置到TransactionSynchronizationManager中
判断是否事务挂起
如果本次开启事务当前线程第一次开启事务,那么获得的事务对象中则没有只有数据库连接对象如果本次开启事务时当前线程中还有事务没有提交,那么获得的事务对象中就拥有数据库连接对象
触发同步器的afterCompletion
判断获得的事务对象中是否持有数据库对象
但是不包含事务对象,也不会去简历数据库连接
把获得的数据库连接对象通过TransactionSynchronizationManager设置到当前线程的ThreadLocal中
将PlatformTransactionManagerTransactionAttrbuteTransactionSattus构造成一个TransactionInfor对象,并返回TransactionInfor对象
doBegin
判断当前异常是否需要回滚
创建事务子流程
不需要回滚
PROPAGATION_REQUIRED
设置数据库连接的timeout
触发同步器的beforeCompletion
触发同步器的afterCommit
回滚事务子流程
查看@Transactinoal注解是否指定了TransactionManager,如果没有指定,,则默认获取TransactionManager类型的bean作为TransactionManager
PROPAGATION_REQUIRES_NEW
调用数据库连接对象的rollback()
开始创建事务
对于TransactionManager有一个限制,必须是PlatformTransactinoManager
如果有则把挂起事务重新设置到TransactionSynchronizationManager中去,并执行同步器的reume方法
调用AbstractPlatformTransactionManager类中getTransaction(txAttr)方法,实际上这个方法就是真正去开启事务的方法
提交子流程
构造一个TransactionStatus
加入@Transactional注解的类,或者类中拥有@Transacitinoal注解的方法,都会生成代理对象作为bean
获取当前正在执行的方法上的@Transactuional注解的信息TransactionAttribute
PROPAGATION_NESTED
调用suspend()方法将当前事务对象进行挂起,并返回supendedResources对象
持有就表示当前线程中存在事务
需要
构造并返回TransactionStatus对象,TransactinoStatus对象中存在suspendedResources,并且跟新TransactinoSynachronizatinoManager中的信息
doBegin的子流程
会把当前事务一些信息设置到TransactionSychronizationManager中
代理对象执行方法时
设置当前数据库连接的隔离级别
调用DataSouceTransactionMaager中的doGetTransaction()得到一个事务对象,得到的事务对象中可能持有也可能没有持有数据库的连接对象
设置数据库连接的antoCommit为false
得到一个TransactionStatus对象
持有
doBegin
调用数据库连接对象commit()
抛异常
生成一个joinpointldentification,作为事务的名字
PROPAGATION_MANDATORY
触发同步器的beforeComit
这个比较简单,就是利用数据库连接对象,设置一个savepoint,比如mysql就支持,再一个事务中,可以再某个位置设置一个savepoint,后续可以值回滚到某个savepoint
如果是其他值则会存在当前事务中运行
PROPAGATION_NEVER
不持有
0 条评论
下一页