Spring事务的原理流程图
2024-07-17 19:15:53 6 举报
spring事务
作者其他创作
大纲/内容
调用DataSourceTransactionManager中的doGetTransaction()得到一个事务对象,得到事务对象中可能持有也可能没有持有数据库连接对象
PROPAGATION_NEVER
事务挂起就是把事务的连接对象,同步器、事务名字、隔离级别记录到SuspendedResourceHolder对象中去,并把TransactionSynchronizationManager中的信息全部清空,清空是为了来记录下一个事务的信息
得到一个TransactionStatus对象
代理对象执行方法时
触发同步器的afterCompletion()
持有就表示当期线程中存在事务
提交子流程
默认情况喜爱为RuntimException或Error会回滚
判断传播机制
设置数据库的timeout
回滚事务的子流程
PROPAGATION_REQUIRED
触发同步器的beforeCompletion()
不持有就表示当前线程中不存在事务
把获得的数据库连接对象通过TransactionSynchronizedManager设置到当前线程的ThreadLocal中
TransactionSynchronizedManager中包含了很多ThreadLocal,用来记录当前线程中事务的各种信息,比如事务的名字、事务对象、事务的隔离级别等。所以我们也可以通过TransactionSynchronizedManager在业务代码中获取事务的一些状态。
调用AbstactPlatformTransactionManager类中的getTransaction(txAttr)方法,实际上这个方法就是真正开启事务的方法
设置数据库的autoCommit为false
触发同步器的afterCommit
判断获得的事务对象中是否持有数据库连接对象
PROPAGATION_REQUIRES_NEW
设置当前数据库连接的隔离级别
PROPAGATION_SUPPORTED如果当前存在事务,则把当前事务挂起,并返回suspendResource对象
创建TransactionStatus对象子流程
调用数据库连接对象的rollback()
开始创建事务
PROPAGATION_MANDATORY
抛异常
会把当前事务的一些信息设置到TransactionSynchronizedManager中
将PlatformTransactionManager、TransactionAttribute、TransactionStatus构造成一个TransactionInfo对象,并返回TransationInfo对象
其它
获取当前正在执行方法上的@Transaction注解的信息TransactionAttribute
构造一个TransactionStatus
创建事务子流程
触发同步器的beforeCommit
创建事务成功后执行业务方法
doBegin
如果是当前线程第一次开始事务,那么获得的事务对象中没有数据库连接对象如果本次开启事务时当前现场中还有事务没有提交,那么获得的事务对象中就拥有数据库连接对象。
如果事务对象中没有持有数据库连接对象,那么则调用DataSource获取一个数据库连接对象,并且设置到事务对象中
不需要回滚则提交
这个比较简单,就是利用数据库连接对象,设置一个savepoint,比如mysql就支持,在一个事务中,可以在在某个位置设置一个savepoint,后续可以只回滚到savepoint
调用数据库连接对象的commit()
持有
如果其它值则会在当前事务中运行
调用suspend()方法将当前事务对象进行挂起,并返回suspendResource对象
PROPAGATION_NESTED
判断是否与事务挂起
需要
如果有事务挂起,则把挂起的事务重新设置到TransactionSynchronizedManager中,并执行同步器的resume()方法
如果执行业务方法没有出现异常,那么则执行完finally的方法后在进行提交
但是不包含事务对象,也不会去建立数据库连接
不持有
如果执行业务方法出现异常,则会进行回滚,然后执行完finally中的方法
加了@Transaction注解的类或者类中拥有加了@Transaction注解的方法,都会为其生成代理对象作为Bean
判断当前异常是否需要回滚
生成一个joinpointIdentification作为事务的名字
doBegin子流程
对于TransactionManager有一个限制,必须是PlatformTransactionManager
0 条评论
下一页