事务传播行为
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");

浙公网安备 33010602011771号