我要進(jìn)行多庫(kù)操作時(shí),事務(wù)是不是這樣的,會(huì)不會(huì)存第一個(gè)提交成功,第二個(gè)提交失敗,導(dǎo)致第一個(gè)不能滾回
Db::connection('api_log')->beginTransaction();
Db::connection('default')->beginTransaction();
try {
// 業(yè)務(wù)處理
Db::connection('api_log')->commit();
Db::connection('default')->commit();
} catch (\Throwable $exception) {
var_dump($exception);
Db::connection('api_log')->rollBack();
Db::connection('default')->rollBack();
}
這種多庫(kù)操作,就不要依賴事務(wù),可以在代碼層面判斷,比如庫(kù)1的事務(wù)1先提交入庫(kù)(標(biāo)記一個(gè)狀態(tài)字段,trans=1 表示還有其他庫(kù)的事務(wù)沒(méi)執(zhí)行完),如果庫(kù)2事務(wù)2也提交成功,則更新庫(kù)1的對(duì)應(yīng)字段trans=2 表示數(shù)據(jù)執(zhí)行完成每一次,如果庫(kù)2事務(wù)2執(zhí)行失敗,則不更新庫(kù)1的數(shù)據(jù),或者可以做刪除操作,表示失敗,大概邏輯是這樣,就是通過(guò)代碼層面判斷。
不知道你說(shuō)的出現(xiàn)問(wèn)題是具體是指什么,那可以考慮把更新庫(kù)1 trans字段的邏輯丟到一個(gè)可靠隊(duì)列,確認(rèn)更新成功ack,才刪除隊(duì)列,如果沒(méi)有ack成功,那只能把這個(gè)數(shù)據(jù)當(dāng)成異常數(shù)據(jù)了,可以記錄日志排查原因。或者可以像那種分布式事務(wù),雙方都確認(rèn)成功才算成功
用這個(gè)嗎,https://dtm.pub/ref/sdk.html#%E6%94%AF%E6%8C%81%E7%9A%84%E8%AF%AD%E8%A8%80 要不然就搞個(gè)重試機(jī)制