多库事务问题,2个库同时提交或同步滚回

quinn

问题描述

我要进行多库操作时,事务是不是这样的,会不会存第一个提交成功,第二个提交失败,导致第一个不能滚回

   Db::connection('api_log')->beginTransaction();
        Db::connection('default')->beginTransaction();

        try {
            // 业务处理

            Db::connection('api_log')->commit();
            Db::connection('default')->commit();

        } catch (\Throwable $exception) {
            var_dump($exception);

            Db::connection('api_log')->rollBack();
            Db::connection('default')->rollBack();

        }
611 3 2
3个回答

深蓝

多库事务,应该没有这么简单,最近我也有这个疑惑。

  • 暂无评论
第六人

这种多库操作,就不要依赖事务,可以在代码层面判断,比如库1的事务1先提交入库(标记一个状态字段,trans=1 表示还有其他库的事务没执行完),如果库2事务2也提交成功,则更新库1的对应字段trans=2 表示数据执行完成每一次,如果库2事务2执行失败,则不更新库1的数据,或者可以做删除操作,表示失败,大概逻辑是这样,就是通过代码层面判断。

  • 深蓝 2024-08-08

    那如果在更新库1对应字段trans=2的过程中出现问题呢?这就是一个死亡螺旋。

  • 第六人 2024-08-08

    不知道你说的出现问题是具体是指什么,那可以考虑把更新库1 trans字段的逻辑丢到一个可靠队列,确认更新成功ack,才删除队列,如果没有ack成功,那只能把这个数据当成异常数据了,可以记录日志排查原因。或者可以像那种分布式事务,双方都确认成功才算成功

初试
  • 暂无评论
×
🔝