我要进行多库操作时,事务是不是这样的,会不会存第一个提交成功,第二个提交失败,导致第一个不能滚回
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();
}
多库事务,应该没有这么简单,最近我也有这个疑惑。
这种多库操作,就不要依赖事务,可以在代码层面判断,比如库1的事务1先提交入库(标记一个状态字段,trans=1 表示还有其他库的事务没执行完),如果库2事务2也提交成功,则更新库1的对应字段trans=2 表示数据执行完成每一次,如果库2事务2执行失败,则不更新库1的数据,或者可以做删除操作,表示失败,大概逻辑是这样,就是通过代码层面判断。
那如果在更新库1对应字段trans=2的过程中出现问题呢?这就是一个死亡螺旋。
不知道你说的出现问题是具体是指什么,那可以考虑把更新库1 trans字段的逻辑丢到一个可靠队列,确认更新成功ack,才删除队列,如果没有ack成功,那只能把这个数据当成异常数据了,可以记录日志排查原因。或者可以像那种分布式事务,双方都确认成功才算成功
用这个吗,https://dtm.pub/ref/sdk.html#%E6%94%AF%E6%8C%81%E7%9A%84%E8%AF%AD%E8%A8%80 要不然就搞个重试机制