天天看點

資料庫的隔離級别和鎖實作

事務的四大特性

  • 原子性:事務的所有操作在資料庫中要麼全部正确反映出來,要麼完全不反映。
  • 一緻性:隔離執行事務時(在沒有其他事務并發執行的情況下)保持資料庫的一緻性。即并發執行的結果要與序列化執行的結果相同。
  • 隔離性:盡管多個事務可能并發執行,但系統保證,對于任何事務 Ti T i 和 Tj T j ,在 Ti T i 看來, Tj T j 或者在 Ti T i 開始執行之前已經完成執行,或者在 Ti T i 完成之後開始執行。是以,每個事物都感覺不到系統中有其他事務在并發執行。
  • 持久性:一個事務成功完成後,它對資料庫的改變必須是永久的,即使出現系統故障。

事務兩大操作

  • read(X):從資料庫把資料項X傳送到執行read操作的事務的主存緩沖區的一個也稱為X的變量中。
  • write(X):從執行write的事務的主存緩沖區的變量X中把資料項X傳回資料庫中。
  • 由于放在主緩沖區中,事務并行執行時會出現問題,下面我們詳細讨論。

事務隔離性

  • 事務處理系統允許多個事務并發執行。但多個事務并發更新資料會引起許多資料一緻性的複雜問題。
  • 事務串行執行——一次執行一個事務,每個事務僅目前一個事務執行完後才執行。可保證資料一緻性,但具有較低的吞吐量和資源使用率。
  • 并發執行的優點
    • 提高吞吐量和資源使用率:一個事務由多個步驟組成。一些涉及I/O活動,一些涉及CPU活動。在計算機系統中CPU與磁盤可以并發運作。是以,I/O活動可以與CPU處理并行進行,多個事務可并發執行。當一個事務在一張磁盤上進行讀寫時,另一個事務可在CPU上運作。增加了系統的吞吐量(給定時間内執行的事務數增加)。同時,CPU與磁盤的使用率也得到提高(如果串行執行,CPU在事務進行磁盤讀寫時處于空閑狀态)。
    • 減少等待時間:系統中有長事務和短事務。如果事務串行地執行,短事務可能得等它前面的長事務完成,這可能導緻難以預測的延遲。
  • 當多個事務并發地執行時,可能違背隔離性,這導緻即使事務都正确地執行,資料庫的一緻性也可能被破壞。

事務隔離級别

  • 未送出讀:允許讀取未送出資料。最低一緻性級别。
    • 髒讀。讀取了未送出的資料。
  • 已送出讀:隻允許讀取已送出的資料,但不要求可重複讀。比如,在事務兩次讀取一個資料項期間,另一個事務更新了該資料并送出。
    • 不可重複讀。
  • 可重複讀:隻允許讀取已送出資料,而且在一個事務兩次讀取一個資料項期間,其他事務不得更新該資料。但事務不要求與其它事務可串行化。
    • 幻讀。兩次讀取資訊不同。
  • 可串行化:通常保證可串行化排程。
  • 圖解

該博文有相關圖解:https://blog.csdn.net/starlh35/article/details/76445267

共享鎖和排他鎖

  • 共享鎖(S)
    • 如果事務 Ti T i 獲得了資料項Q上的共享型鎖,則 Ti T i 可讀但不能寫Q。
  • 排他鎖(X)
    • 如果事務 Ti T i 獲得了資料項Q上的排他型鎖,則 Ti T i 既可讀又可寫Q。
  • 共享型與共享型是相容的,而與排他型不相容。在任何時候,一個具體的資料項上可同時有多個共享型鎖。此後的排它鎖請求必須必須一直等待該資料項上的所有共享型鎖被釋放。
  • 排他鎖與共享鎖不相容,與其它排它鎖也不相容。

并發控制

  • 通過鎖實作,保護資料一緻性。
  • 一級封鎖協定:在讀取事務之前加共享鎖,并在送出該事務後釋放。不能避免髒讀,不可重複讀,幻讀,丢失更新。
  • 二級封鎖協定:在讀取事務前加共享鎖,讀完釋放。在更新資料時加排他鎖,送出後釋放。防止了髒讀,但不能避免不可重複讀,幻讀,丢失更新。
  • 三級封鎖協定:在二級封鎖協定的基礎上加入:讀取之前加共享鎖,并在事務執行完送出後釋放。避免了髒讀和不可重複讀,但不能避免幻讀和丢失更新。
  • 四級封鎖協定:直接對事務中所讀取或者更改的資料所在的表加表鎖,其他事務不能 讀寫該表中的任何資料。可避免髒讀,不可重複讀,幻讀,丢失更新。
  • 圖解

該博文有相關圖解:https://blog.csdn.net/flyingfalcon/article/details/53045672