事务传播行为

    @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类似的操作。

 

学习

posted @ 2022-02-10 18:50  玉米炖排骨  阅读(63)  评论(0编辑  收藏  举报