Spring事务管理

89 阅读1分钟

痛点

  1. 手动提交事务需要写begin,commit的重复代码,可不可以在业务方法开始时程序自动调用begin,结束后自动调用commit,最好报异常自动回滚。
  2. 事务嵌套怎么搞,事务嵌套中使用不同的资源策略,回滚策略

设计

事务管理器TransactionManager

他有三个核心的功能接口

  1. 获取事务资源,资源是任意的,可能来自jdbc connection/hibernate mybatis session
  2. 提交事务
  3. 回滚事务

事务定义transactionDefinition

定义当前方法的隔离级别

事务资源同步器TransactionSynchronizationManager

用来获取资源和区分传播行为

事务状态TransactionStatus

用来存储上一个被挂起的事务

流程

获取到连接资源后,判断如果有事务,没事务、不用事务应该如何处理

public final TransactionStatus getTransaction(TransactionDefinition definition) {
    //创建事务资源 - 比如 Connection
    Object transaction = doGetTransaction();
    
    if (isExistingTransaction(transaction)) {
        // 处理当前已有事务的场景
        return handleExistingTransaction(def, transaction, debugEnabled);
    }else if (def.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRED ||
                def.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRES_NEW ||
                def.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NESTED){
        
        // 开启新事务
        return startTransaction(def, transaction, debugEnabled, suspendedResources);
    }else {
        // 彻底不用事务
    }
    
    // ...
}

当前有事务,根据不同传播行为处理不同。这个稍微有些麻烦,因为子方法有独立事务的需求,可是事务同步管理器只能存一个事务资源。所以新开启的事务记录上一个事务。连接成一个链表

jvm监控调优 mysql锁 springcloud 分库分表 k8s tomcat调优