• 事务传播行为


        @Transactional
        public void methodA(){
            methodB();
            //doSomething
        }
    
        @Transaction(Propagation=XXX)
        public void methodB(){
            //doSomething
        }

    事务管理员与事务协调员

    简单理解:

      如果 A 方法中调用了 B 方法,而A方法有事务,B方法也有事务。

         我们就称 A方法中的事务是事务管理员,B方法中的事务是事务协调员。

    事务传播行为:

      描述的是事务协调员对事务管理员所携带事务的处理态度。

    Spring中7中事务传播行为

    传播属性 事务管理员 事务协调员 过程说明 描述

    REQUIRED

    假定:事务协调员的态度配成了REQUIRED

    开启T1 加入T1 如果事务管理员发起的时候有事务T1,而事务协调员配置成了REQUIRED,则事务协调员加入T1 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
    新建T2 如果事务管理员发起的时候没有开事务,而事务协调员配置成了REQUIRED,事务协调员需要事务,此时,事务协调员会新建一个事务T2
    REQUIRES_NEW 开启T1 新建T2 如果事务管理员开了个事务T1,事务协调员配置为REQUIRES_NEW,事务协调员会新建一个事务T2 新建事务,如果当前存在事务,把当前事务挂起。
    新建T2 如果事务管理员没有事务,事务协调员配置为REQUIRES_NEW,事务协调员会新建一个事务T2
    SUPPORTS 开启T1 加入T1 如果事务管理员开了个事务T1,事务协调员配置为SUPPORTS,事务协调员会加入事务T1
    支持当前事务,如果当前没有事务,就以非事务方式执行。
    如果事务管理员没有事务,事务协调员配置为SUPPORTS,事务协调员没有事务

    NOT_SUPPORTED

    (不支持事务)

    开启T1 如果事务管理员开了个事务T1,事务协调员配置为NOT_SUPPORTED,事务协调员不支持事务,于是事务协调员没有事务 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
    如果事务管理员没有事务,事务协调员配置为NOT_SUPPORTED,事务协调员不支持事务,于是事务协调员没有事务

    MANDATORY

    (必须有事务)

    开启T1 加入T1 如果事务管理员开了个事务T1,事务协调员配置为MANDATORY,事务协调员会加入事务T1 使用当前的事务,如果当前没有事务,就抛出异常。
    ERROR
    如果事务管理员没有事务,事务协调员配置为MANDATORY,事务协调员要求必须有事务,于是事务协调员报错

      NEVER

    (千万不要带事务)

    开启T1 ERROR 如果事务管理员开了个事务T1,事务协调员配置为NEVER,事务协调员要求事务管理员千万不要带事务,但事务管理员带了事务,于是事务协调员报错 以非事务方式执行,如果当前存在事务,则抛出异常。
    如果事务管理员没有事务,事务协调员配置为NEVER,事务协调员要求事务管理员千万不要带事务,事务管理员也没带事务,于是事务协调员也没有事务
    NESTED 设置savePoint,一旦事务回滚,事务将回滚到savePoint处,交由客户响应提交/回滚   如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

    学习

  • 相关阅读:
    mysql笔记05 优化服务器设置
    mysql笔记04 MySQL高级特性
    mysql笔记03 查询性能优化
    MVC模型
    mysql笔记02 创建高性能的索引
    实现服务端功能之——Java实体对象
    leetcode解题: First Unique Character in a String (387)
    vim的使用心得
    Java多线程(五)--volatile详解
    七 生成式深度学习
  • 原文地址:https://www.cnblogs.com/jerryspace/p/15880419.html
Copyright © 2020-2023  润新知