• 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、事务资源清理。

  • 相关阅读:
    好记性不如烂笔头-linux学习笔记2kickstart自动化安装和cacti
    好记性不如烂笔头-linux学习笔记1
    关于TP5中的依赖注入和容器和facade
    vbs 脚本2
    vbs脚本
    Memcache 和 Radis 比较
    MongoDB 索引的使用, 管理 和优化
    mysql大数据高并发处理
    sql处理高并发
    LB 负载均衡的层次结构
  • 原文地址:https://www.cnblogs.com/yaohuiqin/p/9486975.html
Copyright © 2020-2023  润新知