spring如何局部去掉事物

worktile 其他 13

回复

共3条回复 我来回复
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    在Spring中,如果需要在某个方法上禁用事务,可以通过以下几种方式实现局部去掉事务:

    1. 通过使用 @Transactional 注解的 propagation 属性。propagation 属性可以控制事务的传播行为,默认值为 REQUIRED,表示如果当前方法已经处在一个事务中,则加入该事务;如果当前方法没有事务,则创建一个新事务。如果我们将 propagation 属性设置为 NOT_SUPPORTED,则表示不支持事务,即该方法将不会启动或加入任何事务。

    2. 通过在方法上使用 @Transactional 注解的 readOnly 属性。readOnly 属性为 true 表示当前方法只读,不会对数据库进行任何更新操作,因此也不需要事务支持。在使用 readOnly 属性时,建议同时设置 propagation 属性为 NOT_SUPPORTED,以确保事务被完全禁用。

    3. 通过在方法上使用 @Transactional 注解的 noRollbackFor 属性。noRollbackFor 属性可以指定某些异常不进行事务回滚,即使方法抛出了这些异常也不会触发事务回滚。通过将需要禁用事务的方法抛出的异常添加到 noRollbackFor 属性中,可以实现局部去掉事务的效果。

    4. 通过在方法上使用 TransactionTemplate 来手动控制事务的启动和提交。TransactionTemplate 是 Spring 提供的一个用于编程式操作事务的工具类。通过在需要禁用事务的方法中创建 TransactionTemplate 实例,并在方法中使用该实例的 execute() 方法执行需要运行在无事务环境下的逻辑,然后在需要的地方手动控制事务的启动和提交。

    总的来说,以上四种方式都可以实现在Spring中局部禁用事务的效果,具体选择哪种方式视需求场景和个人喜好而定。

    1年前 0条评论
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    在Spring中,可以通过配置@Transactional注解来开启或关闭事务。如果只希望在某个方法中取消事务的应用,可以采取以下几种方式:

    1. 在方法上使用@Transaction注解,并设置属性propagation=Propagation.NOT_SUPPORTED。该属性表示该方法不受事务的管理。
      例如:

      @Transactional(propagation = Propagation.NOT_SUPPORTED)
      public void doSomethingWithoutTransaction() {
         // 方法体
      }
      
    2. 使用编程式事务进行控制,可以在需要取消事务的方法中手动开启和关闭事务。
      例如:

      @Autowired
      private PlatformTransactionManager transactionManager;
      
      public void doSomethingWithoutTransaction() {
         DefaultTransactionDefinition def = new DefaultTransactionDefinition();
         def.setPropagationBehavior(TransactionDefinition.PROPAGATION_NOT_SUPPORTED);
         TransactionStatus status = transactionManager.getTransaction(def);
         try {
            // 方法体
            transactionManager.commit(status);
         } catch (Exception ex) {
            transactionManager.rollback(status);
            throw ex;
         }
      }
      
    3. 使用AOP切面来控制事务的开启和关闭。可以通过在切面中设置条件来决定是否开启事务。
      例如:

      @Aspect
      @Component
      public class TransactionalAspect {
      
         @Before("@annotation(org.springframework.transaction.annotation.Transactional) && !@annotation(com.example.NoTransaction)")
         public void before(JoinPoint joinPoint) {
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
         }
      }
      
    4. 使用@Transactional注解中的noRollbackFor属性,指定某些异常不回滚事务。如果方法中抛出指定的异常,事务不会回滚。
      例如:

      @Transactional(noRollbackFor = {CustomException.class})
      public void doSomethingWithoutTransaction() {
         // 方法体
      }
      
    5. 在配置文件中设置全局的事务管理器,并根据需要在方法上使用@Transactional注解或xml配置来开启或关闭事务。
      例如,在Spring配置文件中添加以下代码:

      <tx:annotation-driven transaction-manager="transactionManager"/>
      <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
          <property name="dataSource" ref="dataSource"/>
      </bean>
      

      然后在方法上使用@Transactional注解开启或关闭事务。

    以上是几种局部去掉事务的方式,根据具体的业务场景选择合适的方式来控制事务的应用。

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

    在Spring框架中,可以通过使用@Transactional注解来管理事务。默认情况下,当一个方法被@Transactional注解标记时,该方法及其对数据库的操作会在一个事务中执行。然而,有时候我们可能需要在一个被@Transactional注解标记的方法中的某些特定操作上去掉事务的管理。

    以下是几种常见的方法来局部去掉事务管理:

    1. 使用Propagation属性设置为NOT_SUPPORTED
      在@Transactional注解中,可以通过设置Propagation属性为NOT_SUPPORTED来去掉事务管理。示例如下:
    @Transactional(propagation = Propagation.NOT_SUPPORTED)
    public void methodWithoutTransaction(){
        // 在此方法中的操作将不会被事务管理
    }
    
    1. 使用Spring的TransactionTemplate
      使用Spring的TransactionTemplate可以更为灵活地控制事务,包括局部去掉事务管理。示例如下:
    @Autowired
    private PlatformTransactionManager transactionManager;
    
    public void methodWithoutTransaction(){
        TransactionTemplate template = new TransactionTemplate(transactionManager);
        template.setPropagationBehavior(TransactionDefinition.PROPAGATION_NOT_SUPPORTED);
        template.execute(status -> {
            // 在此方法中的操作将不会被事务管理
            return null;
        });
    }
    
    1. 在方法内调用另一个没有事务管理的方法
      在一个被@Transactional注解标记的方法中,可以调用另一个没有事务管理的方法来达到局部去掉事务管理的效果。示例如下:
    @Transactional
    public void methodWithTransaction(){
        // 执行一些需要事务管理的操作
    
        updateDatabaseWithoutTransaction();
    }
    
    public void updateDatabaseWithoutTransaction(){
        // 在此方法中的操作将不会被事务管理
    }
    

    在这种情况下,由于在方法内部调用的方法没有被@Transactional注解标记,所以其中的操作将不会被事务管理。

    需要注意的是,当在方法内部调用另一个有事务管理的方法时,事务管理仍然会生效,除非在被调用的方法上显式地去掉事务管理。

    总结:
    在Spring框架中,可以通过设置注解属性、使用TransactionTemplate或在方法内调用其他未被事务管理的方法来实现局部去掉事务管理的效果。根据具体的需求和场景选择适合的方法来处理事务。

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

400-800-1024

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

分享本页
返回顶部