spring 事务是怎么传播的
-
Spring事务的传播是指在多个事务方法之间的事务传播行为。在Spring中,事务是通过TransactionDefinition和TransactionStatus两个类来管理的。
TransactionDefinition定义了事务的属性,包括事务的传播行为、隔离级别、读写特性等。Spring中的事务传播行为共有7种,分别是:
- REQUIRED:如果当前存在事务,则加入到该事务中,如果当前没有事务,则新建一个事务。
- SUPPORTS:如果当前存在事务,则加入到该事务中,如果当前没有事务,则以非事务的方式运行。
- MANDATORY:如果当前存在事务,则加入到该事务中,如果当前没有事务,则抛出异常。
- REQUIRES_NEW:不管当前是否存在事务,都会新开启一个事务。
- NOT_SUPPORTED:以非事务的方式运行,如果当前存在事务,则将其挂起。
- NEVER:以非事务的方式运行,如果当前存在事务,则抛出异常。
- NESTED:如果当前存在事务,则在当前事务的嵌套事务中执行,如果当前没有事务,则新开启一个事务。
TransactionStatus表示当前事务的状态,可以通过它来判断事务的执行结果,可以手动回滚事务等。
事务传播的具体逻辑由Spring容器来管理和控制。当一个事务方法被调用时,如果该方法没有指定事务传播行为,则会采用默认的传播行为,通常为REQUIRED。当有多个事务方法相互调用时,根据其事务传播行为的不同,可能会产生以下几种情况:
- REQUIRED:事务方法A调用事务方法B,如果A不存在事务,则B会以A的事务为基础创建一个新的子事务,如果A存在事务,则B会加入到A的事务中。
- SUPPORTS:事务方法A调用事务方法B,如果A不存在事务,则B会以非事务的方式运行,如果A存在事务,则B会加入到A的事务中。
- REQUIRES_NEW:事务方法A调用事务方法B,无论A存在还是不存在事务,B都会创建一个新的事务。
- NESTED:事务方法A调用事务方法B,如果A不存在事务,则B会以A的事务为基础创建一个新的嵌套事务,如果A存在事务,则B会加入到A的事务中作为一个嵌套事务。
事务的传播行为能够灵活地处理多个事务方法之间的事务关联,确保数据的一致性和完整性。在实际应用中,根据业务需求和数据库特性,选取适合的事务传播行为能够有效地提升系统性能和数据可靠性。
1年前 -
Spring事务传播是指在使用Spring框架进行事务管理时,事务的传播行为的规则。事务传播指的是当一个方法调用另一个方法时,事务在这两个方法之间是如何传播和处理的。
Spring框架提供了以下几种事务传播行为:
-
PROPAGATION_REQUIRED(默认):如果当前存在事务,则加入当前事务,如果不存在事务,则创建一个新的事务。这是最常见的传播行为,适用于大部分情况。
-
PROPAGATION_SUPPORTS:如果当前存在事务,则加入当前事务中;如果没有事务,则以非事务方式执行。这种传播行为适用于不需要使用事务的情况,如果当前存在事务则加入,如果没有事务也不会创建新的事务。
-
PROPAGATION_MANDATORY:如果当前存在事务,则加入当前事务;如果没有事务,则抛出异常。这种传播行为适用于必须在一个已存在的事务中执行的情况,如果没有事务则抛出异常。
-
PROPAGATION_REQUIRES_NEW:每次调用都会创建一个新的事务,如果当前存在事务则挂起当前事务。这种传播行为适用于需要独立的事务执行的情况,比如一些独立的业务逻辑。
-
PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务则挂起当前事务。这种传播行为适用于不需要使用事务的情况,即使当前存在事务也会挂起。
总结起来,Spring事务传播行为用来控制方法之间如何使用事务。可以根据具体的业务需求选择合适的传播行为。通过使用不同的事务传播行为,可以实现灵活的事务管理。
1年前 -
-
Spring的事务传播规则是用于定义事务在多个方法调用之间如何传播和交互的一种机制。Spring提供了多种事务传播行为以满足不同的应用需求。
一、事务传播行为
-
PROPAGATION_REQUIRED: 如果当前存在事务,则加入该事务,如果不存在事务,则创建一个新的事务。
-
PROPAGATION_SUPPORTS: 如果当前存在事务,就加入该事务,如果没有事务,则以非事务方式执行。
-
PROPAGATION_MANDATORY: 如果当前存在事务,则加入该事务,如果没有事务,则抛出异常。
-
PROPAGATION_REQUIRES_NEW: 创建一个新的事务,如果当前存在事务,则挂起当前事务。
-
PROPAGATION_NOT_SUPPORTED: 以非事务方式执行操作,如果当前存在事务,则挂起当前事务。
-
PROPAGATION_NEVER: 以非事务方式执行操作,如果当前存在事务,则抛出异常。
-
PROPAGATION_NESTED: 如果当前存在事务,则在嵌套事务中执行,如果没有事务,则创建一个新的事务。
二、事务传播应用场景
-
PROPAGATION_REQUIRED:适用于大多数情况,必要时将多个方法的操作合并到一个事务中,如多个方法共同更新数据库。
-
PROPAGATION_SUPPORTS:适用于查询操作,可以共享一个只读事务。
-
PROPAGATION_MANDATORY:适用于必须在事务中执行的方法,如果没有事务,则直接抛出异常。
-
PROPAGATION_REQUIRES_NEW:适用于需要独立事务的方法,即使外部有事务正在进行,也会挂起外部事务。
-
PROPAGATION_NOT_SUPPORTED:适用于不需要事务支持的方法,不受当前事务影响。
-
PROPAGATION_NEVER:适用于必须在无事务环境下执行的方法,如果存在事务,则抛出异常。
-
PROPAGATION_NESTED:适用于需要多个方法在一个父事务中执行,如果没有父事务,则创建一个新的事务。
三、事务传播设置示例
@Transactional(propagation = Propagation.REQUIRED) public void methodA() { // do something } @Transactional(propagation = Propagation.REQUIRED) public void methodB() { // do something } @Transactional(propagation = Propagation.REQUIRES_NEW) public void methodC() { // do something }在上面的示例中,methodA和methodB的事务传播设置为REQUIRED,表示如果当前存在事务,则加入该事务,如果不存在事务,则创建一个新的事务。methodC的事务传播设置为REQUIRES_NEW,表示创建一个新的事务,如果当前存在事务,则挂起当前事务。
四、事务传播注意事项
-
事务传播设置只对public方法有效,对private、protected或默认访问级别的方法无效。
-
事务传播设置只对通过代理访问的方法有效,通过实例方法调用不会触发事务传播。
-
默认情况下,事务传播设置是继承的,即子方法会继承父方法的事务传播设置。可以通过设置@Transactional(propagation = Propagation.NOT_SUPPORTED)来取消继承。
总结:Spring的事务传播机制可以根据需要进行灵活配置,通过选择合适的事务传播行为,可以实现对事务的控制和管理。在设计应用系统时,需要根据业务需求和方法之间的关系来选择合适的事务传播行为。
1年前 -