事务传播机制:多个事务⽅法存在调⽤关系时, 事务是如何在这些⽅法间进⾏传播的。
⽐如:有两个⽅法A,B都被 @Transactional 修饰,,A⽅法调⽤B⽅法 A⽅法运⾏时, 会开启⼀个事务。当A调⽤B时, B⽅法本⾝也有事务, 此时B⽅法运⾏时, 是加⼊A的事务,还是创建⼀个新的事务呢? 这个就涉及到了事务的传播机制。
事务隔离级别解决的是多个事务同时调用⼀个数据库的问题,而事务传播机制解决的是一个事务在多个节点(方法)中传递的问题。
事务传播机制的分类:
Propagation.REQUIRED | A有事务,B就用A的事务。A没有事务,B就创建事务。(默认传播级别) |
Propagation.SUPPORTS | A有事务,B就用A的事务。A没有事务,B就非事务方式运行。 |
Propagation.MANDATORY | A有事务,B就加入。A没有事务,B抛异常。 |
Propagation.REQUIRES_NEW | A有事务,就挂起事务(不使用),创建新的事务。A没有事务,也创建新的事务 |
Propagation.NOT_SUPPORTED | A有/没有事务,B都以非事务的方式运行。 |
Propagation.NEVER | A有事务,抛异常。A没有事务,B以非事务的方式运行。 |
Propagation.NESTED | A有事务,创建一个事务嵌套当前事务。A没有事务,默认。 |