事务传播行为

2023.8.31

1.事务的传播依靠ThreadLocal线程副本

2.PROPAGATION_REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。(默认的)

3.PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。

4.PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。

5.PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

6.PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。

7.PROPAGATION_MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常。

8.PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

9.被调用的,也就是内部方法,需要有@Transactional注解

 

2023.9.3

1.如果使用never,因为是代理的方式处理事务,假如A有事务,调B方法,B方法还没执行,就是还没走到B,判断A有事务,B为Never,就直接报错了。

2.事务的传播是从上到下的,假如一个A方法是required,里面调用一个require_new的B方法,B会自己开一个事务,但是如果B抛异常回滚了,A还是能感知到,也回滚。

3.使用nested可以实现的效果,A调B,B为nested,B的回滚不影响A,但是A如果报错回滚,B也跟着回滚。

4.nested虽然也是新开一个事务,但是事务的提交时间和require_new不同。

5.nested体现的是一种父子事务关系,两个事务之间是有关联的,核心思想就是子事务不会独立提交,而是根据父事务来确定。但是可以独立的回滚(父事务要try...catch一下,避免影响)。

6.nested依靠的是回滚点

connection.setSavepoint("asd");

 

posted @ 2023-08-31 00:30  sellingpear  阅读(27)  评论(0)    收藏  举报