尊敬的大佬们:
小弟初学springboot 集成 rabbitmq,遇到了一个问题,就是关于rabbitmq消费端异常回滚问题。
比如: 我们下了一个订单,把相关业务放到rabbitmq消费端处理,现在同时需要处理2个事件,第一需要修改订单状态,第二需要修改用户的余额,在springboot里我们可以使用@Transactional可以保证以上两点同时修改才算完成,但是在rabbitmq消费端@Transactional就失效了,导致比如第一部修改状态完成,中间出现了异常,第二部修改用户余额的操作就没有进行。求解,怎么在rabbitmq消费者端实现sql执行的回滚操作。代码如下:
@Transactional(rollbackFor = Exception.class)
@RabbitListener(queues = Demo.DELAYED_QUEUE)
public void delayedQueueReceiver(Map map, Message message, Channel channel) throws IOException {
try {
Test test1 = new Test();
testMapper.insert(test1);
L.error("插入-" + test1.getDid());
int i = 1 / 0; //处理出现异常
Test test2 = new Test();
testMapper.insert(test2);
L.error("插入-" + test2.getDid());
} catch (Exception e) {
L.error("发生了异常" + e.getMessage());
e.printStackTrace();
}
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
}
以上代码,导致test2失败,test1成功,我希望如果test2失败,哪test1也不执行。