削弱資料庫中的交易隔離等級會導致什麼結果?

大家好。弗拉迪斯拉夫·羅丹正在聯繫。我目前是 OTUS 高工作負載架構師課程的課程負責人,同時也教授軟體架構課程。

除了教學之外,您可能已經注意到,我正在為 Habré 的 OTUS 部落格撰寫原創資料,我想與今天的文章相一致,以配合課程的推出 “PostgreSQL”,現已開放報名。

削弱資料庫中的交易隔離等級會導致什麼結果?

介紹

В 上次 我們討論了資料庫中的事務可以解決兩個問題:確保容錯和在競爭環境中存取資料。要完全執行這些任務,事務必須具有 ACID 屬性。今天我們就來詳細聊聊這封信 我(隔離) 在這個縮寫中。

絕緣

隔離解決了在競爭環境中存取資料的問題,本質上提供了針對競爭條件的保護。理想情況下,隔離意味著序列化,這是確保並行執行事務的結果與順序執行事務相同的屬性。此屬性的主要問題是技術上提供非常困難,因此對系統效能有很大影響。這就是為什麼隔離常常被削弱,接受某些異常的風險,這將在下面討論。發生某些異常的可能性精確地表徵了事務隔離的層級。

最廣為人知的異常是:髒讀、不可重複讀、幻讀,但實際上還有5種:髒寫、遊標遺失更新、遺失更新、讀取傾斜、寫傾斜。

髒寫

異常的本質是事務可以覆蓋未提交的資料。

削弱資料庫中的交易隔離等級會導致什麼結果?

這種異常是危險的,不僅因為提交兩個事務後數據可能會發生衝突(如圖所示),還因為違反了原子性:由於我們允許覆蓋未提交的數據,因此不清楚如何回滾一個事務而不影響另一個事務。

這種異常可以很簡單地處理:我們在開始記錄之前先給記錄附加一個鎖,禁止其他交易更改記錄,直到鎖被移除。

髒讀

髒讀是指讀取未提交的資料。

削弱資料庫中的交易隔離等級會導致什麼結果?

當需要根據樣本採取行動或做出決策時,就會出現問題。

為了糾正異常,您可以附加讀鎖,但這會極大地影響效能。說得更簡單,對於回溯事務,資料的初始狀態(開始記錄之前)必須保存在系統中。為什麼不從那裡讀呢?它足夠便宜,大多數資料庫預設都會刪除髒讀。

遺失更新

Lost update 是遺失更新的意思,翻譯相當準確地反映了問題的本質:

削弱資料庫中的交易隔離等級會導致什麼結果?

事實上,交易T2的結果是相反的。這種情況可以透過顯式或隱式寫鎖來修正。也就是說,我們要嘛簡單地更新記錄,然後發生隱式鎖,要嘛執行 選擇更新,導致發生讀寫鎖。請注意,這樣的操作是相當危險的:透過我們的「無辜」閱讀,我們阻止了其他閱讀。一些資料庫提供更安全的 選擇分享,允許讀取資料但不能修改資料。

遊標丟失更新

為了更好地控制,底座可以提供其他工具,例如遊標。遊標是一種包含一組行並允許您迭代它們的結構。 為 select_statement 宣告cursor_name。遊標的內容由select描述。

為什麼需要遊標?事實上,某些資料庫對 select 選擇的所有記錄提供鎖定(讀取穩定性),或僅對遊標目前所在的記錄提供鎖定(遊標穩定性)。透過遊標穩定性,實現了短鎖,這使得我們在迭代大量資料樣本時可以減少鎖的數量。因此,針對遊標單獨隔離遺失更新異常。

不可重複讀取

不可重複讀是指在我們的事務執行過程中,連續2次讀取同一筆記錄會導致不同的結果,因為另一個事務介入了這兩次讀取之間,改變了我們的資料並被提交。

削弱資料庫中的交易隔離等級會導致什麼結果?

為什麼這還是一個問題?想像一下,圖中交易T2的目標是選擇所有價格低於150美元的商品。其他人將價格更新為 200 美元。因此,安裝的過濾器不起作用。

當增加兩個互鎖或使用MVCC機制時,這些異常現象就不再發生,我想單獨討論。

幻讀

幻影是對另一個事務添加的資料的讀取。

削弱資料庫中的交易隔離等級會導致什麼結果?

舉個例子,我們可以觀察到當這種異常發生時,我們會錯誤地選擇最便宜的產品。

擺脫幻讀已經相當困難了。定期阻止是不夠的,因為我們無法阻止尚不存在的東西。 2PL 系統使用預測鎖定,而 MVCC 系統具有事務調度程序,可以回滾可能因插入而中斷的事務。第一和第二機構都相當重。

讀取傾斜

當我們使用多個表時,會發生讀取偏差,這些表的內容必須一致地更改。

假設我們有代表貼文及其元資訊的表格:

削弱資料庫中的交易隔離等級會導致什麼結果?

一個事務從表中讀取,另一個事務修改它們:

削弱資料庫中的交易隔離等級會導致什麼結果?

作為事務 T1 的結果,該帖子的 title = Good,並且 Updated_by = T2,這是某種不一致。

事實上,這是一個不可重複的讀取,而是作為幾個表的一部分。

為了解決這個問題,T1 可以在它將讀取的所有行上加鎖,這將防止事務 T2 更改資訊。如果是MVCC,T2交易將被取消。如果我們使用遊標,防止這種異常現象就變得很重要。

寫入傾斜

這種異常現像也更容易用一個例子來解釋:假設在我們的系統中至少有一名醫生應該值班,但兩位醫生都決定取消他們的值班:

削弱資料庫中的交易隔離等級會導致什麼結果?

削弱資料庫中的交易隔離等級會導致什麼結果?

這種異常現象意味著沒有醫生會值班。為什麼會發生這種情況?因為該事務正在檢查可能被另一個事務違反的條件,並且由於隔離,我們沒有看到此變更。

這是相同的不可重複讀取。或者,選擇可以對這些記錄加鎖。

寫傾斜和讀傾斜是前面異常的組合。您可以考慮寫入傾斜,這本質上是幻讀。考慮一個包含員工姓名、薪資以及他們從事的專案的表格:

削弱資料庫中的交易隔離等級會導致什麼結果?

削弱資料庫中的交易隔離等級會導致什麼結果?

結果,我們得到了以下情況:每個經理都認為他們的變革不會導致超出預算,因此他們進行了人事變動,這些變動共同導致了成本超支。

問題的原因與幻讀中完全相同。

發現

放寬資料庫中的事務隔離等級是安全性和效能之間的權衡;應根據發生某些異常時對業務的潛在風險來選擇該等級。

了解有關課程的更多信息。

來源: www.habr.com

添加評論