spring事务传播性怎么样
-
Spring事务提供了多种事务传播性选项,用于定义事务在不同方法之间是如何传播的。
-
REQUIRED: 默认传播性选项,表示如果当前存在事务,则使用该事务;如果不存在事务,则创建一个新事务。
-
SUPPORTS: 表示如果当前存在事务,则使用该事务;如果不存在事务,则不开启新事务,以非事务方式运行。
-
MANDATORY: 表示如果当前存在事务,则使用该事务;如果不存在事务,则抛出异常。
-
REQUIRES_NEW: 表示无论当前是否存在事务,都创建一个新事务。如果当前存在事务,则挂起当前事务。
-
NOT_SUPPORTED: 表示不开启事务运行,如果当前存在事务,则挂起当前事务。
-
NEVER: 表示不允许在方法中运行事务。如果当前存在事务,则抛出异常。
-
NESTED: 表示如果当前存在事务,则嵌套在当前事务中执行;如果不存在事务,则创建一个新事务。
通过合理选取事务传播性选项,可以实现对应场景下的事务管理。在实际应用中,需要根据具体业务需求来选择合适的传播性选项,以保证事务的一致性和隔离性。
1年前 -
-
Spring事务传播性是指在多个事务操作之间如何处理事务的传播方式。Spring框架提供了七种不同的事务传播行为,以满足不同的业务需求。
-
REQUIRED:默认的传播行为,如果当前存在事务,则加入该事务,如果不存在事务,则创建一个新的事务。如果外层存在事务,内层抛出异常,内层事务将回滚,外层事务可以决定是否回滚。
-
SUPPORTS:如果当前存在事务,则加入该事务,如果不存在事务,则以非事务的方式执行。适用于不需要事务支持的场景,当外层有事务时,内层操作会参与事务。
-
MANDATORY:必须在一个已存在的事务中执行,如果不存在事务,则抛出异常。适用于必须要在一个已存在的事务中执行的场景。
-
REQUIRES_NEW:无论当前是否存在事务,都创建一个新的事务进行执行,如果外层事务存在,则挂起外层事务。适用于需要通过事务独立执行的场景。
-
NOT_SUPPORTED:以非事务的方式执行操作,如果当前存在事务,则挂起事务。
-
NEVER:以非事务的方式执行操作,如果当前存在事务,则抛出异常。适用于必须在没有事务的上下文中执行的场景。
-
NESTED:如果当前存在事务,则在该事务的嵌套事务中执行,如果不存在事务,则创建一个新的事务。嵌套事务有自己的保存点,可以进行部分提交和部分回滚。如果外层事务回滚,内层事务也会回滚;内层事务回滚不会影响外层事务。适用于需要独立控制内层事务的场景。
Spring事务传播性的选择应根据业务需求进行合理选择,以保证事务的一致性和正确性。
1年前 -
-
Spring事务传播性是指在多个事务方法之间进行事务传播的行为。事务传播性定义了事务方法在调用其他事务方法时如何使用或创建一个事务。
Spring框架提供了7种事务传播性:
-
REQUIRED(默认):如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。该传播性适用于大多数情况,确保方法在事务中执行。
-
SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式执行方法。
-
MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。该传播性适用于必须在事务中执行的方法。
-
REQUIRES_NEW:创建一个新的事务,并暂停当前事务(如果存在)。如果当前存在事务,则挂起当前事务,并在方法执行完成后恢复该事务。
-
NOT_SUPPORTED:以非事务的方式执行方法,并挂起当前事务(如果存在)。如果没有事务存在,则直接执行方法。
-
NEVER:以非事务的方式执行方法。如果当前存在事务,则抛出异常。
-
NESTED:如果当前存在事务,则在嵌套事务中执行;如果当前没有事务,则创建一个新的事务。如果外部事务提交,嵌套事务也会提交;如果外部事务回滚,嵌套事务也会回滚。
使用Spring的事务管理器,可以在方法上使用@Transactional注解来设置事务的传播性。例如:
@Transactional(propagation = Propagation.REQUIRED) public void methodA() { // 事务处理逻辑 } @Transactional(propagation = Propagation.REQUIRES_NEW) public void methodB() { // 事务处理逻辑 } @Transactional(propagation = Propagation.NESTED) public void methodC() { // 事务处理逻辑 }在上述示例中,methodA使用了REQUIRED传播性,methodB使用了REQUIRES_NEW传播性,methodC使用了NESTED传播性。
需要注意的是,事务传播性只能在public方法上生效,对于private、protected或默认访问级别的方法,Spring无法代理该方法以应用事务设置。此外,事务传播性还受事务管理器的支持程度影响,不同的事务管理器可能对事务传播性的支持程度不同。
1年前 -