spring事务怎么传播

worktile 其他 19

回复

共3条回复 我来回复
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    Spring事务的传播行为是指在一个事务方法中调用另一个事务方法时,如何处理事务的传播情况。Spring框架为开发者提供了多种事务传播行为,以适应不同业务场景的需求。

    1. REQUIRED传播行为
      REQUIRED是Spring事务的默认传播行为,表示当前方法必须在一个事务中运行,如果当前存在事务,则加入该事务,如果当前没有事务,则创建一个新的事务。REQUIRED传播行为常用于业务方法之间的调用,确保它们在同一个事务中执行。

    2. SUPPORTS传播行为
      SUPPORTS表示当前方法不需要一个事务来运行,如果当前存在事务,则加入该事务,如果当前没有事务,则以非事务的方式运行。SUPPORTS传播行为常用于查询方法,确保在查询时不会创建不必要的事务。

    3. MANDATORY传播行为
      MANDATORY表示当前方法必须在一个事务中运行,如果当前存在事务,则加入该事务,如果当前没有事务,则抛出异常。MANDATORY传播行为常用于需要强制使用事务的方法,确保其在事务中执行。

    4. REQUIRES_NEW传播行为
      REQUIRES_NEW表示当前方法必须在一个新的事务中运行,如果当前存在事务,则挂起该事务,并创建一个新的事务。REQUIRES_NEW传播行为常用于需要将一部分业务逻辑作为独立的事务执行的方法,确保其在新的事务中运行。

    5. NOT_SUPPORTED传播行为
      NOT_SUPPORTED表示当前方法不应该在一个事务中运行,如果当前存在事务,则挂起该事务,并以非事务的方式运行。NOT_SUPPORTED传播行为常用于不需要事务支持的方法,以提高性能。

    6. NEVER传播行为
      NEVER表示当前方法不应该在一个事务中运行,如果当前存在事务,则抛出异常。NEVER传播行为常用于不允许在事务中执行的方法。

    7. NESTED传播行为
      NESTED表示当前方法必须在一个嵌套的事务中运行,如果当前存在事务,则在该事务的内部创建一个嵌套事务。如果当前没有事务,则创建一个新的事务。NESTED传播行为常用于需要在事务中嵌套使用事务的方法,确保其在嵌套事务中执行。

    以上是Spring事务传播行为的常见选项,可以根据具体的业务需求来选择合适的传播行为。在配置事务管理器时,可以通过设置@Transactional注解或XML配置来指定事务的传播行为。

    1年前 0条评论
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    Spring事务传播是指在一个方法调用另一个方法时,如何处理事务的传播行为。事务传播行为是定义在事务管理器中的,用于控制事务的范围和边界。在Spring中,事务传播行为有以下几种:

    1. REQUIRED:如果当前存在事务,则加入该事务,如果不存在事务,则创建一个新的事务。这是Spring的默认传播行为。

    2. SUPPORTS:如果当前存在事务,则加入该事务;如果当前不存在事务,则以非事务的方式执行。

    3. MANDATORY:强制要求当前存在事务,如果当前不存在事务,则抛出异常。

    4. REQUIRES_NEW:创建一个新的事务,并挂起当前的事务。如果当前存在事务,则将其挂起。

    5. NOT_SUPPORTED:以非事务的方式执行操作。如果当前存在事务,则将其挂起。

    除了以上几种传播行为,Spring还提供了一些其他的传播行为:

    1. NEVER:以非事务的方式执行方法。如果当前存在事务,则抛出异常。

    2. NESTED:在当前事务的范围内,创建一个嵌套事务。如果当前存在事务,则在当前事务的子事务中执行,子事务可以独立提交或回滚,不会影响到父事务。

    在进行事务传播设置时,需要根据实际需求和业务逻辑来选择合适的传播行为。合理的事务传播设置可以保证数据的一致性和完整性,提高系统的并发性和可靠性。

    1年前 0条评论
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    Spring框架提供了事务管理的机制,用于管理数据库操作的一致性和事务的并发问题。事务传播是指在方法调用链中,多个方法共享同一个事务,并定义了事务的边界和作用范围。Spring提供了多种事务传播行为,可以根据实际的业务需求选择合适的传播行为。

    Spring事务传播行为包括以下几种:

    1. REQUIRED:如果当前存在事务,则加入当前事务,如果当前没有事务,则创建一个新的事务。这是默认的传播行为。

    2. SUPPORTS:如果当前存在事务,当前方法则在事务中执行;如果当前不存在事务,则当前方法在非事务环境中执行。

    3. MANDATORY:如果当前存在事务,当前方法则在事务中执行;如果当前不存在事务,则抛出异常。

    4. REQUIRES_NEW:当前方法必须开启一个新的事务,并挂起当前事务,直到当前方法执行完毕。

    5. NOT_SUPPORTED:当前方法在非事务环境中执行,如果当前存在事务,则将事务挂起。

    6. NEVER:当前方法在非事务环境中执行,如果当前存在事务,则抛出异常。

    7. NESTED:当前方法创建一个保存点,类似于ProvidesACID性质中的嵌套事务。如果当前存在事务,则在当前事务中创建一个新的保存点,当前方法在新的保存点中执行;如果当前没有事务,则创建一个新的事务。

    以下是使用注解和XML配置两种方式来设置事务传播行为的示例:

    1. 使用注解方式设置事务传播行为:
    // 在service层的方法上使用@Transactional注解设置事务传播行为
    @Transactional(propagation = Propagation.REQUIRED)
    public void methodA() {
        // ...
    }
    
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void methodB() {
        // ...
    }
    
    1. 使用XML配置方式设置事务传播行为:
    <tx:annotation-driven/>
    <!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    
    <!-- 在service层的方法上使用tx:method标签设置事务传播行为 -->
    <bean id="testService" class="com.example.TestServiceImpl">
        <property name="testDao" ref="testDao"/>
        <property name="transactionManager" ref="transactionManager"/>
        <property name="proxyTargetClass" value="true"/> <!-- 使用CGLIB代理 -->
    </bean>
    
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="methodA" propagation="REQUIRED"/>
            <tx:method name="methodB" propagation="REQUIRES_NEW"/>
        </tx:attributes>
    </tx:advice>
    
    <aop:config>
        <aop:pointcut id="testServicePointcut" expression="execution(* com.example.TestService.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="testServicePointcut"/>
    </aop:config>
    

    通过设置不同的事务传播行为,可以灵活地控制事务的范围和行为,确保数据库操作的一致性和并发问题。根据业务需求选择合适的事务传播行为,并在方法或配置中添加相应的注解或XML配置即可。

    1年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部