????首先事务传遍是
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是公用一个事务,无论谁报错都需要一起回滚
|