同时有数据库和消息队列,消息队列失败怎么回退?

比如下面有段代码:

//数据库操作
XXXX
//队列操作
QQQQ

数据库操作失败了可以利用事务rollback

但如果数据库操作成功,而队列操作失败,这怎么rollback?

或者这个时候应该采取什么方案来保证两个操作的事务性。

阅读 3.5k
3 个回答

这是一个典型的分布式事务的应用场景,如果你们系统中引入了分布式事务很简单。如果没引入,可以用一下的做法实现:

  1. 数据库加个字段标识MQ的操作状态
  2. 先写入数据库,将这个状态设置为待确认
  3. 写入MQ,成功后设置MySQL状态为已确认
  4. 如果这个MQ失败,可以尝试重试,如果重试失败,这个状态设置为失败

这样不会影响你的业务逻辑。

楼上明显错误,两者不相关,你难道要在队列里面抛异常?
消息队列最好做到异步处理,不然你就拖累数据库了。
异步里面单独做队列推送成功失败的验证,然后做回滚处理。具体要看你业务需求了

try {
    //数据库操作
    XXXX
    //队列操作
    QQQQ
    DB::commit();
} catch (Exception $e) {
    DB::rollback();
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题