首頁 > 資料庫 > mysql教程 > MySQL交易的隔離等級是什麼

MySQL交易的隔離等級是什麼

WBOY
發布: 2023-06-01 17:26:08
轉載
2651 人瀏覽過

一、隔離等級的概念

為什麼要考慮隔離等級?

因為交易要並發執行,而並發執行可能會出現一些問題:髒讀、不可重複讀和虛讀,有的是允許出現的,有的不允許出現,對於這種不同程度上的出現或不出現的並發控制才有了不同的隔離等級。

MySQL支援的四個隔離等級是:

  • #TRANSACTION_READ_UNCOMMITTED:未提交讀取。說明在提交前事務A可以看到事務B的變化。這樣讀髒數據,不可重複讀和幻讀都是被允許的。

  • TRANSACTION_READ_COMMITTED:已提交讀取(oracle預設),說明讀取未提交的資料是不允許的(防止髒讀)。在這個層次仍然允許不可重複讀和幻讀發生。

  • TRANSACTION_REPEATABLE_READ:可重複讀取(MySQL預設),說明事務保證能夠再次讀取相同的資料而不會失敗,即使其他的事務把這個數據改了,你也不會看到前後兩次查詢的資料的不同。但是幻讀仍然會出現。

  • TRANSACTION_SERIALIZABLE:串行化,是最高的事務隔離級別,它防止髒讀,不可重複讀取和幻讀。串行執行,相當於單線程操作,並發能力最低​​

MySQL交易的隔離等級是什麼

注意:

#交易隔離等級越高,為避免衝突所花費的效能也就越多,即效率低。在「可重複讀」級別,實際上可以解決部分的虛讀問題,但是不能防止update更新產生的虛讀問題,要禁止虛讀產生,還是需要設定串行化隔離級別。

MySQL客戶端預設工作在可重複讀取層級:

MySQL交易的隔離等級是什麼

#二、測試TRANSACTION_READ_UNCOMMITTED隔離等級

MySQL交易的隔離等級是什麼

MySQL交易的隔離等級是什麼

若此時A客戶端rollback,資料庫中zhangsan的年齡恢復到了20,這時候已經來不及了,因為B客戶端已經拿著21去做業務了。

MySQL交易的隔離等級是什麼

兩個客戶端都rollback放棄對目前交易對資料所做的修改,zhangsan年齡恢復為20

MySQL交易的隔離等級是什麼

# #三、測試TRANSACTION_READ_COMMITTED隔離級別

MySQL交易的隔離等級是什麼

MySQL交易的隔離等級是什麼

#因為設定了已提交讀取隔離級別,所以事務B並沒有發生髒讀,這是由各種鎖機制以及事務並發的MVCC版本控制實現的。

MySQL交易的隔離等級是什麼

在已提交讀取隔離等級下,查詢已經提交的資料可能會導致不可重複讀取發生,這是允許的。既然發生了不可重複讀,幻讀就肯定可以發生了。

四、測試TRANSACTION_REPEATABLE_READ隔離等級

MySQL交易的隔離等級是什麼

MySQL交易的隔離等級是什麼

#在某意義上,可重複讀取可以避免幻讀的出現。因為目前的可重複讀取隔離等級可以防止insert操作。雖然可重複讀取隔離等級可以防止insert和delete操作,但無法防止update操作。

MySQL交易的隔離等級是什麼

實際上,事務A已經插入並且提交了,aaa已經存在,因為事務B update aaa的年齡成功了

當同一查詢在前後兩次被執行時,如果資料量不同,會導致幻讀的發生。要徹底解決幻讀問題,在可重複讀取隔離等級下是無法實現的,必須將隔離等級提高到串列化

五、測試TRANSACTION_SERIALIZABLE隔離等級

MySQL交易的隔離等級是什麼#

MySQL交易的隔離等級是什麼

從現像看,串列化可以解決幻讀,同樣的條件進行查詢,在另一個表裡面插入資料時就被阻塞,由於事務B正在讀數據,此時事務A再寫資料就被阻塞了(用讀寫鎖實現,允許讀讀,不允許讀寫或寫寫)

MySQL server不會讓自己執行事務的線程永遠阻塞,導致當前執行緒佔用的鎖無法釋放,而使得其他執行事務的執行緒也無法獲得鎖而永遠阻塞。如果執行事務的執行緒等待的時間過長,會觸發逾時機制,導致執行緒釋放鎖定並傳回一個錯誤

MySQL交易的隔離等級是什麼

以上是MySQL交易的隔離等級是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板