在循环中传播新事务(使用REQUIRES_NEW)无法按预期工作

时间:2017-03-07 08:15:06

标签: java spring hibernate transactions

我不确定为什么以下不起作用。我希望新的事务在循环中开始(propagation = REQUIRES_NEW)。并且应该在此循环中触发新事务之前提交每个事务。但是,只有循环的第一次迭代才会执行,然后没有任何反应。

   @Service
    @Transactional
    public class Aimpl implements A {

    @Autowired
    private B b;

    private Logger logger = LoggerFactory.getLogger(this.getClass());

      public void methodA(List<Customer> customers){
       logger.info("before loop"); //gets printed
       customers.forEach(customer -> {
         logger.info("1"); //--> this gets printed
         b.processEachCustomer(customer);
         logger.info("2"); //- this does not get printed 
         });
         logger.info("after loop"); //does not get printed
      }
    }

//-----------------Second class----------


 @Service
    @Transactional
    public class Bimpl implements B {

     @Autowired
     private MyRepository repository;

     private Logger logger = LoggerFactory.getLogger(this.getClass());

      @Transactional(propagation = Propagation.REQUIRES_NEW)
      public void processEachCustomer(Customer customer){

        //process each customer - a new transaction everytime 
       //and it should be committed independently
       repository.updateCustomerData(customer.getId());
       logger.info("3");//this does not get printed
      }
    }

这是我的存储库类,它只在一行的表中发出更新查询。

public interface MyRepository extends Repository<Customer , Long> {

    @Modifying
    @Query("UPDATE Customer c SET c.status = 1 WHERE i.id= :id")
    int setStatusById(@Param("id") Integer id);

}

我在这里做错了什么?基本上,为什么只有循环的第一次迭代工作而其余部分不工作?我正在尝试调试它,并且在第一次迭代后看不到应用程序在断点处停止。

2 个答案:

答案 0 :(得分:0)

方法A将创建默认范围为REQUIRED的事务,因为@Transactional处于类级别。

答案 1 :(得分:0)

当我从methodA()中删除注释并且还删除了类Aimpl中的类级事务注释时,这工作正常。

 @Service
    public class Aimpl implements A {

    @Autowired
    private B b;

    private Logger logger = LoggerFactory.getLogger(this.getClass());

      public void methodA(List<Customer> customers){
       customers.forEach(customer -> {
         b.processEachCustomer(customer);
         });
      }
    }

// -----------------第二类----------

@Service
@Transactional
public class Bimpl implements B {

 @Autowired
 private MyRepository repository;

 private Logger logger = LoggerFactory.getLogger(this.getClass());

  @Transactional(propagation = Propagation.REQUIRES_NEW)
  public void processEachCustomer(Customer customer){

    //process each customer - a new transaction everytime 
   //and it should be committed independently
   repository.updateCustomerData(customer.getId());
  }
}

编辑2:我在这里纠正自己。即使我不从方法中删除事务注释并让类保持使用事务注释,这也可以正常工作。这里真正的问题是由于某些其他进程获得的锁而在数据库级别上发生的死锁。代码是正确的。