在框架如Spring中,常见的事务传播级别包括:
-
REQUIRED(默认传播行为):
-
如果当前已经存在事务,则加入当前事务。如果没有事务,则创建一个新的事务。
-
这是大多数场景下最常用的传播级别,因为它确保所有操作要么在同一个事务中成功,要么一起回滚。
-
-
REQUIRES_NEW:
-
无论当前是否有事务,都创建一个新的事务。如果已经有事务存在,当前事务会被挂起,直到新的事务完成。
-
这种传播方式适合于需要保证某一部分逻辑独立于外部事务执行的场景。
-
-
SUPPORTS:
-
如果当前有事务,则该方法加入该事务;如果没有事务,则非事务性地执行。
-
适用于对事务没有强依赖的操作。如果有事务,加入;如果没有,也可以正常执行。
-
-
NOT_SUPPORTED:
-
无论当前是否存在事务,该方法总是在非事务环境下执行。如果存在事务,则会被挂起,直到该方法完成。
-
这种方式适合那些不希望事务管理干扰的操作,例如一些耗时较长的非数据库操作。
-
-
MANDATORY:
-
方法必须在已有事务中执行。如果调用该方法时没有事务存在,则抛出异常。
-
适用于强制要求在事务中执行的操作,如果没有事务就是不合法的。
-
-
NEVER:
-
该方法不能在事务中执行。如果存在事务,则抛出异常。
-
适合不希望某些操作在事务中执行的场景,通常是对事务不友好的操作。
-
-
NESTED:
-
如果当前有事务,则创建一个嵌套事务(Nested Transaction)。嵌套事务允许内部事务的独立提交或回滚,而不会影响外部事务。
-
这种方式适合处理需要部分提交或回滚的复杂事务场景。
-
--------------------------------------------------------------------------------------------------------------------------------
REQUIRED(默认传播行为)
例如下面代码:被事物标记的方法上加上REQUIRED,确保了多次调用该方法的事物要么一起成功执行要么一起回滚;即在一个订单内支付所以商品的金额才能交易成功,否则全部失败
REQUIRES_NEW:
在一个订单内只有余额不足的订单支付失败,其它都会成功