事务处理的完成有两种情况,即回滚事务或者提交事务。
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、事务资源清理。