陪玩系統原始碼開發,不懂資料庫隔離級別的請進

雲豹科技程式設計師發表於2021-12-27

1 MySQL的事物隔離級別是為了解決什麼問題?

事物隔離級別是為了解決陪玩系統原始碼中事物併發問題。
事物併發問題其實就和我們在編寫併發陪玩系統原始碼時的執行緒安全問題是類似的,執行緒安全問題是多個執行緒同時修改了一個變數,如果不加鎖,就可能出現類似於超賣這種型別的問題。事物併發,是多個客戶端連線同時修改資料庫的某條記錄也可能會出現類似的問題,並且事物是會發生回滾的,這就又加重了問題的複雜程度。

我們將陪玩系統原始碼中事物併發問題總結起來,就是以下幾種:

  1. 髒讀: 事務A讀取了事務B修改的資料,然後事物B回滾,那麼事物A讀取到的資料是髒資料
  2. 不可重複讀: 事務 A 多次讀取同一資料,事務 B在事務A多次讀取的過程中,對資料作了更新並提交,導致事務A多次讀取到的同一資料時不一致。
  3. 幻讀:事物A將陪玩系統原始碼資料庫中所有資料修改為另一種形式,但是事物B就在這個時候插入了一條新的資料,事物A修改結束後發現仍有一條記錄沒有修改過來,就像發生了幻覺一樣,這就叫幻讀。

總結:

在陪玩系統原始碼中不可重複讀的和幻讀很容易混淆,不可重複讀側重於修改,幻讀側重於新增或刪除。
解決不可重複讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖整張表。

2 MySQL中都有哪些隔離級別?

SQL的標準就是定義了四種隔離級別,
基於上訴事物併發問題,MySQL為我們提供了幾種解決方案,就是如下幾種(√ 選的是會出現問題的)

在這裡插入圖片描述

每一種隔離級別其實也就是鎖的級別,什麼問題都忽略即不加鎖,什麼問題都解決即將並行執行轉為序列執行。
陪玩系統原始碼中隨著加鎖的程度越來越強,資料庫的併發效能越來越弱。

3 MySQL的每種隔離級別都會加什麼鎖?

1、讀未提交(效能優,問題多)

加鎖情況:

  • 陪玩系統原始碼中事務在讀資料的時候並未對資料加鎖。
  • 事務在修改資料的時候只對資料增加行級共享鎖。

2、讀已提交(網際網路常常使用的隔離級別,效能優)

讀已提交其實是針對於事物而言,不讀取沒有提交的事物,這樣就不會產生髒讀。
讀已提交的事務隔離級別是大多數流行資料庫的預設事務隔離界別,比如 Oracle,但是不是 MySQL 的預設隔離界別。

加鎖情況:只會對索引增加 Record Lock

  • 事務對當前被讀取的資料加行級共享鎖(當讀到時才加鎖),一旦讀完該行,立即釋放該行級共享鎖;
  • 事務在更新資料的瞬間(就是發生更新的瞬間),必須先對其加行級排他鎖,直到事務結束才釋放。

3、可重複讀

可重複讀是將讀取到的資料鎖定起來,保證在陪玩系統原始碼的事物內,讀取到的資料是一致的。
MySQL為了解決幻讀問題增加了 Gap Lock 和 Next-Key Lock(可通過配置檔案設定);
加鎖情況:為了解決幻讀的問題,在支援 Record Lock 的同時,還支援 Gap Lock 和 Next-Key Lock;

  • 事務在讀取某資料的瞬間(就是開始讀取的瞬間),加行級共享鎖,直到事務結束才釋放;
  • 事務在更新某資料的瞬間(就是發生更新的瞬間),加行級排他鎖,直到事務結束才釋放。

4、序列化
直接把並行變為序列,相當於單執行緒執行任務,效能極低,一般在陪玩系統原始碼開發中不會使用。

加鎖情況:

  • 事務在讀取資料時,必須先對其加表級共享鎖 ,直到事務結束才釋放;
  • 事務在更新資料時,必須先對其加表級排他鎖 ,直到事務結束才釋放。

4 總結

陪玩系統原始碼中事物的隔離級別就是資料庫為我們提供了選擇的權利,在效能和資料準確程度上,根據業務做取捨,有舍必有得。
對於MySQL來說InnonDB引擎才會有事物和事物隔離級別的說法。

本文轉載自網路,轉載僅為分享乾貨知識,如有侵權歡迎聯絡雲豹科技進行刪除處理
原文連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69996194/viewspace-2849540/,如需轉載,請註明出處,否則將追究法律責任。

相關文章