spring传播行为

spring 多线程事务问题。
多线程事务

spring 传播行为

什么是事务的传播特性?
指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行。

老大 方法a()
小弟方法 b()

// 老大方法中有小弟方法
a(){
b();
}

死活不要事务 :

never

never加在b()方法上,b死活不要事务
当执行b()方法时,b()传播行为为never 表示 改方法以以实物运行。
当a()调用b()方法,如果a本身没有事务,正常非事务执行,
如果a()有事务,就抛出异常。

Not_Supports

加在b()方法上, a()调用b()
当执行b()方法时,b()传播行为为Not_Supports 表示 该方法以非事务运行。
     如果a()没有事务,以非事务执行,
 如果a()有事务,将事务挂起 表示,b()不参与事务,执行完b() 后,再继续事务

可有可无

Supports

如果没有就以非事务运行,有就使用当前事务。

必须要有事务

Requires_new

必须有新的事务,有没有都新建事务,如果原来有,就将原来的事务挂起,新建新的
b() 使用requires_new ,a() 调用b(),如果a()没事务, a 继续没有事务,b创建新事务,
如果a()有事务,就将a()挂起,b执行自己的事务
里面事务回滚,不会影响外面事务。 两个事务互不影响。
小弟事务回滚,不会影响老大事务。

Nested

a调用b ,如果a没有事务,b就新建事务,
如果a有事务,就在当前事务中嵌套其他事务。
PROPAGATION_NESTED:肯定会创建子事务,父影响子,子不影响父;

  1. 如果外部事务失败时,会回滚内部事务的所有操作,
    2.内部事务操作失败,不会引起外部事务的回滚。

Required

如果没有就创建一个事务, 如果有就加入当前事务 常见。
a调用b
a有事务,b加入。
a无事务,b自己创建一个事务,跟a没关系。

Mandatory

强制,如过没有直接抛出异常, 如果有,就加入当前事务。
b() 使用Mandatory, a()调用b(),如果a() 无事务,b就抛出异常,
a() 有事务,b()加入

REQUIRES_NEW启动的新事务不依赖于外部事务,是完全独立的,这意味着事务commit和rollback操作都是独立的,不受外部事务commit或者rollback影响。
REQUIRES_NEW会启动一个独立的新事务,这个事务将被完全 commited 或 rollback 而不依赖于外部事务,它拥有自己的隔离范围,自己的锁等等。

NESTED是依赖于外部事务的子事务,只有当外部事务commit时,子事务才能commit;外部事务发生异常rollback,子事务也要回滚。
嵌套事务是外部事务的一部分,只有外部事务结束后它才会被提交。

总结下NESTED的回滚特性:

  • 主事务和嵌套事务属于同一个事务
  • 嵌套事务出错回滚不会影响到主事务
  • 主事务回滚会将嵌套事务一起回滚了

PROPAGATION_REQUEIRES_NEW:肯定会创建子事务,父子互不影响;
PROPAGATION_NESTED:肯定会创建子事务,父影响子,子不影响父;
PROPAGATION_REQUEIRED:子事务和父事务合并成一个事务,父子互相影响;

如果想实现:子影响父,但父不影响子的效果,我觉得可以把传播级别设置 PROPAGATION_REQUEIRES_NEW,然后在父中捕获子的异常,然后再抛出异常来实现。

你可能感兴趣的:(java,学习,spring,java,后端)