Spring的事务传播机制是什么?


    首先事务传遍是 Spring自带的而不是MySQL的,数据库本身是不包含这些行文的。

那什么是Spring的事务传播机制呢?

    多个事务相互调用时,事务如何在这些方法直接传播?spring提供了7种不同的传播特性,来保证事务的正常执行。

     也就是A类有个a()方法,B类有一个B()方法。如果在a()的方法逻辑中调用了B类的b()方法逻辑,那么B是用a()的事务呢,还是b()的事务呢,还是new一个新的,还是挂起。

七中传播特性的区别

1.Required

    默认的事务传遍机制,如果当前没事务,就new一个。如果当前存在事务,则加入这个事务。

a()方法调用了b()方法,如果a有事务,那么b()就用a的事务。如果a里面没有事务,那么b()就new一个

2.Supports(用的很少)

    当前存在事务,则加入当前事务。如果当前没事务,则以非事务的方式执行。

a()方法中调用b()方法,如果a有事务,那么b()就用a的事务。如果a没有事务,那么b()也就不用事务。

3.Mandatory

    当前存在事务,则加入当前事务,如果当前不存在事务,则抛出异常。

a()方法中调用b()方法,如果a有事务,那么b()就用a的事务。如果a没有事务,那么b就报错,抛出异常

4.Required_New

    创建一个新事物,如果当前存在事务,则挂起事务。

a()方法中调用b()方法,如果a有事务,那么会把a的事务挂起(把a()事务阻塞起来),然后b()自己创建一个新事物。如果a没有事务,那么b()直接创建一个新事物

5.Not_Supports

    以非事务方法执行,如果当前存在事务,则挂起事务。

a()方法中调用b()方法,如果a()有事务,则会把a()的事务挂起,都不用事务。如果a没事务,那么就一起不用事务

6.Never(几乎不用)

    不使用事务,如果当前事务存在,则会抛出异常

a()方法中调用b()方法,如果a()有事务,那么会抛出异常。如果a()没有事务,那么一起以非事务方式执行。

7. Nested

    如果当前存在事务,则在嵌套事务中执行,否则和Required一样。

嵌套使用就是:
     如果a有事务,那么会给当前事务执行中设置一个保存点,然后b()以a的事务继续往下走,如果b()执行失败了,那么会回滚,回滚到当前的保存点上。

Nested和Required_New的区别

    Required_New是无论a有没有事务,b()都会新建一个事务,如果a有事务,那么会把a的事务挂起。而Nested是在当前事务上开始一个嵌套事务,如果父事务回滚,子事务也会回滚。

Nested和Required的区别

    如果子事务发生异常,子事务会回滚,父事务不会。而Required是公用一个事务,无论谁报错都需要一起回滚

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值