spring事务是怎么传播的
-
Spring事务传播是指在多个方法调用的过程中,事务的传播行为。在Spring中,事务传播有多种类型,如REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW等。不同的传播类型决定了事务在方法调用过程中的行为。
- REQUIRED(默认):在方法调用过程中,如果当前存在事务,则使用该事务,如果不存在事务,则创建一个新的事务。如果存在嵌套事务,则将方法的执行纳入到上层事务中。
- SUPPORTS:在方法调用过程中,如果当前存在事务,则使用该事务,如果不存在事务,则不开启事务。适用于在事务中执行的方法,这样可以复用当前的事务。
- MANDATORY:在方法调用过程中,如果当前存在事务,则使用该事务,如果不存在事务,则抛出异常。该传播类型要求方法在事务中执行,如果不存在事务则认为是非法的。
- REQUIRES_NEW:无论当前是否存在事务,都创建一个新的事务。如果存在嵌套事务,则将上层事务挂起,新事务执行完毕后再恢复上层事务。
- NOT_SUPPORTED:不支持事务。在方法调用过程中,如果当前存在事务,则将事务挂起,方法执行完毕后再恢复事务。
- NEVER:不支持事务。在方法调用过程中,如果当前存在事务,则抛出异常。
- NESTED:在方法调用过程中,如果当前存在事务,则创建一个嵌套事务。嵌套事务独立于上层事务,但仍然受上层事务的控制。
根据不同的业务需求,选择合适的事务传播类型可以保证事务的一致性和隔离性。Spring通过事务传播机制来管理多个方法之间的事务,确保数据的完整性和一致性。在编写业务代码时,需要根据实际情况选择适当的事务传播类型,以便实现预期的事务行为。
1年前 -
Spring事务传播是Spring框架中用于控制事务的机制。它定义了事务在不同方法之间如何传播和交互的方式。通过事务传播机制,我们可以实现更复杂的事务管理,满足不同业务需求。
下面是Spring事务的传播行为:
-
REQUIRED(默认):如果当前存在事务,则加入该事务,如果当前不存在事务,则创建一个新事务。这是最常用的传播行为,确保方法执行在一个事务内。
-
SUPPORTS:如果当前存在事务,就加入该事务;如果当前不存在事务,就以非事务方式执行。这种传播行为适用于不需要事务支持的方法,即使在事务存在的情况下,方法也可以以非事务方式执行。
-
MANDATORY:如果当前存在事务,则加入该事务,如果当前不存在事务,则抛出异常。这种传播行为要求方法在一个事务内执行,如果没有事务存在则会抛出异常。
-
REQUIRES_NEW:创建一个新的事务,并且挂起当前的事务。如果当前存在事务,则把当前事务挂起,创建新的事务执行方法,方法执行完毕再恢复上层事务。这种传播行为适用于需要独立的事务进行操作的方法,即使上层存在事务,也会挂起事务并创建新的事务执行。
-
NOT_SUPPORTED:以非事务方式执行方法,如果当前存在事务,挂起事务再执行方法。这种传播行为适用于不需要事务的方法,即使在事务存在的情况下,方法也会以非事务方式执行。
除了以上5种传播行为外,Spring还提供了其他几种传播行为,例如:NEVER(不支持事务,如果当前存在事务则抛出异常)、NESTED(如果当前存在事务,则在嵌套事务内执行)。通过根据业务需求选择合适的传播行为,我们可以实现更灵活的事务管理。
总结起来,Spring事务的传播行为决定了一个方法在面对事务时的行为。不同的传播行为适用于不同的业务场景,可以确保事务的一致性和完整性。
1年前 -
-
Spring中的事务传播是指在一个事务内部,如果存在多个事务边界的情况下,一个事务内的操作如何处理和传播。Spring通过事务传播机制来控制事务的行为,保证事务的一致性和完整性。
Spring中事务的传播行为有七种,分别为:
- REQUIRED:如果当前存在事务,则加入该事务,如果没有事务,则新建一个事务。
- REQUIRES_NEW:无论当前是否存在事务,均新建一个事务,并挂起当前事务。
- NESTED:如果当前存在事务,则在当前事务的嵌套事务中执行,如果没有事务,则新建一个事务。
- SUPPORTS:如果当前存在事务,则加入该事务,如果没有事务,则以非事务的方式执行。
- NOT_SUPPORTED:无论当前是否存在事务,均以非事务的方式执行,如果当前存在事务,则挂起事务。
- MANDATORY:如果当前存在事务,则加入该事务,如果没有事务,则抛出异常。
- NEVER:无论当前是否存在事务,均以非事务的方式执行,如果当前存在事务,则抛出异常。
在Spring中,可以通过在方法或类上添加@Transactional注解来指定事务的传播行为。在事务方法执行之前,Spring会根据事务注解进行事务管理。当调用一个事务方法时,Spring会检查当前是否已经存在一个事务,然后根据事务的传播行为进行相应的处理。
例如,如果一个方法A使用REQUIRED传播行为,另一个方法B调用了方法A,则:
- 如果方法B没有事务,方法A会创建一个新的事务,并在方法B执行完毕后提交事务。
- 如果方法B已经存在一个事务,并且方法A和方法B属于同一个事务,则方法B和方法A会在同一个事务内执行。
- 如果方法B已经存在一个事务,并且方法A和方法B不属于同一个事务,则方法B的事务会先挂起,然后方法A开始一个新的事务,在方法A执行完毕并提交事务后,方法B的事务会恢复执行。
事务的传播行为可以根据实际需求进行选择和配置,以保证数据一致性和业务逻辑的正确性。
1年前