資料庫隔離級別對巢狀事務的影響

2021-09-29 11:36:03 字數 663 閱讀 3987

最近做了乙個區塊鏈資料相關的專案,業務系統需要跟區塊鏈上資料同步,在測試環境沒有任何問題,部署到成員方之後突然出現資料同步失敗。仔細分析了業務**沒有發現任何異常,對比了各種環境之後,發現只有資料庫事務隔離級別不同,懷疑是隔離級別導致。

整個資料同步流程的事務情況為

1.對每個塊開啟乙個外層事務。

2.迴圈對塊中的每筆交易使用require_new開啟乙個內層事務。

3.提交內層事物。

4.提交外層事務。

由於每筆交易的處理需要校驗起始金額,而起始金額需要依賴前一筆交易的處理結果。

事務的隔離級別為rc時外層事務可以讀到內層提交的事務結果,當為rr時外層事務無法讀到內層事務提交的結果。

基於以上兩點,我們可以得出

在資料庫隔離級別為rc時,不會有任何問題。

在資料庫隔離級別為rr時,如果乙個塊中只有一筆交易也不會有問題。

在資料庫隔離級別為rr時,如果乙個塊中有多筆交易就會有問題。原因是處理完塊中第一筆交易之後再處理第二筆時,第一筆交易的處理結果雖然已經提交但是外層事務不可見,所以在處理第二筆時校驗起始金額出錯,然後整個外層事務會回滾,重新處理第一筆交易。但是由於第一筆交易已經提交到資料庫,所以依然處理失敗。

在事務有巢狀的時候一定要注意事務隔離級帶來的影響。

資料庫事務隔離級別

資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted rea...

資料庫事務隔離級別

資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted rea...

資料庫事務隔離級別

資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable 這四個級別可以逐個解決髒讀 不可重複讀 幻讀 這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted re...