事务处理的完成有两种情况,即回滚事务或者提交事务。
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对应资源的绑定。
- 如果之前有挂起的事务恢复事务的挂起。