Spring框架事务管理机制源码分析:rollback和commit

事务处理的完成有两种情况,即回滚事务或者提交事务。

AbstractPlatformTransactionManager提供的rollback(TransactionStatus)和commit(TransactionStatus)两个模板方法,分别对应这两种情况的处理。

在事务处理过程中,我们可以通过TransactionStatus的setRollbackOnly方法标记事务回滚,所以commit(TransactionStatus)在具体提交事务之前会检查rollBackOnly状态,如果该状态被设置,则转而执行事务的回滚操作。

rollback(TransactionStatus var1) 的逻辑主要包含以下3点:

1、回滚事务

  • 如果是嵌套事务,则通过TransactionStatus释放Savepoint。
  • 如果TransactionStatus表示当前事务是一个新事务,则调用子类的doRollback(TransactionStatus)方法真正的回滚事务。doRollback(TransactionStatus)是抽象方法,子类必须去实现它。
  • 如果当前存在事务,并且rollbackOnly状态被设置,则调用由子类实现的doSetRollbackOnly(TransactionStatus)方法,各子类实现通常会将当前的transaction object 状态设置成rollBackOnly

2、触发Synchronization事件

3、清理事务资源:

  • 设置TransactionStatus中的completed为完成状态
  • 清理当前事务相关的Synchronization
  • 调用doCleanupAfterCompletion()释放事务资源,并解除到Transaction SynchronizationManager的资源绑定。对于DataSourceTransactionManager来说,是关闭数据库连接,然后解除对DataSource对应资源的绑定。
  • 如果之前有挂起的事务恢复事务的挂起。

 

commit:

在事务处理过程中,我们可以通过TransactionStatus的setRollbackOnly方法标记事务回滚,所以commit(TransactionStatus)在具体提交事务之前会检查rollBackOnly状态,如果该状态没有被设置,则执行正常的事务提交操作。

提交事务时,会涉及如下几种情况:

1、提交事务事务时

  • 决定是否提前检测全局的rollBackOnly标志。如果最外层事务已经被标记为rollBackOnly,并且failEarlyOnGlobalRollBackOnly为true,则抛出异常。
  • 如果提交事务之前发现TransactionStatus持有Savapoint,则释放它。这实际上是在处理嵌套事务的提交。
  • 如果TransactionStatus表示要提交的事务是一个新事务,则调用子类的doCommit(TransactionStatus)方法实现提交事务

2、触发Synchronization相关事件

3、如果AbstractPlatformTransactionManager的rollbackOnCommitFailure 状态被设置成true,则表示如果在事务提交过程中出现异常,需要回滚事务。即当commit方法捕获到异常,并且检测到该字段被设置的时候,需要回滚事务。反之如果被设置为false,则出现异常也不回滚。

4、事务资源清理。

posted @ 2018-08-16 14:17  yaohuiqin  阅读(1932)  评论(0编辑  收藏  举报