今天开发遇到一个问题,在MQ消费过程中,在订单生成后,后续操作失败,导致订单和订单从表数据回滚删除的时候,JPA接口调用delete删除订单主表成功,但是调用JPA自定义方法删除订单从表时会报错:
发现是jpa使用“1”的写法是没有问题,使用“2”的方式删除 就会出问题
org.springframework.dao.InvalidDataAccessApiUsageException:
No EntityManager with actual transaction available for current thread - cannot
reliably process 'remove' call; nested exception is javax.persistence.TransactionRequiredException:
No EntityManager with actual transaction available for current thread - cannot
reliably process 'remove' call
后来发现是因为MQ异步消费的时候,没有事务导致无法使用,解决方式,在方面头上增加注解: @Transactional
1、注解中默认的Propagation,
当次方法存在一个事务中,则不需要重新创建事务,使用当前事务;
2、@Transactional(propagation = Propagation.REQUIRES_NEW)
当注解中标注Propagation.REQUIRES_NEW的时候,说明本方法不管在什么情况下,都重新发起一个事务!