@Transactional 注解与事务同步器:确保 MQ 消息在事务提交后发送
@Transactional 注解与事务同步器:确保 MQ 消息在事务提交后发送
在使用 Spring 进行数据库操作时,我们经常使用 @Transactional 注解来标识需要在事务中执行的方法。为了确保某些操作(例如发送 MQ 消息)在事务提交完成后才执行,我们可以使用 Spring 的 TransactionSynchronizationManager 来注册一个事务同步器。
示例代码:
@Transactional(rollbackFor = Exception.class)
TackAnOrderVo tackAnOrder(@RequestBody @Validated PlaceOrderVo vo) {
// 提交订单
// 提交库存
// 提交其他
// 发送消息到 MQ
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
@Override
public void afterCommit() {
// 发送mq更新es库存标志
for (Long drugId : drugIdList) {
DrugChangeMessage drugChangeMessage = new DrugChangeMessage();
drugChangeMessage.setDrugId(drugId);
drugChangeMessage.setStoreId(order.getStoreId());
drugChangeMessage.setChangeType(5);
drugChangeMessage.setMerchantId(Long.parseLong(merchantId));
drugChangeMessage.setEnterpriseId(Long.parseLong(enterpriseId));
drugChangeMessage.setPlatformId(Long.parseLong(platformId));
drugProducer.sendDrugChangeMsg(drugChangeMessage);
}
}
});
}
解释:
-
使用
@Transactional(rollbackFor = Exception.class)注解标识方法需要在事务中执行,并且在发生异常时进行回滚。 -
使用
TransactionSynchronizationManager.registerSynchronization()方法注册一个事务同步器。 -
在
afterCommit()方法中,发送 MQ 消息。
通过这种方式,我们可以在事务提交完成后再发送 MQ 消息,避免在发生异常时发送错误的消息。
注意:
TransactionSynchronizationManager是一个线程绑定的类,它可以保证在同一个线程中注册的事务同步器会按顺序执行。- 在
afterCommit()方法中,可以使用TransactionSynchronizationManager的getResource()方法获取事务相关的信息,例如当前的事务状态。
总结:
@Transactional 注解和 TransactionSynchronizationManager 提供了一种有效的方式来确保 MQ 消息在事务提交完成后再发送,提高了系统的可靠性和安全性。
原文地址: https://www.cveoy.top/t/topic/pgKc 著作权归作者所有。请勿转载和采集!