首頁  >  文章  >  資料庫  >  資料庫事務隔離等級有哪些

資料庫事務隔離等級有哪些

青灯夜游
青灯夜游原創
2021-05-24 15:05:1634248瀏覽

資料庫交易隔離等級:1、Read Uncommitted(讀取未提交);2、Read Committed(讀取已提交);3、Repeatable Read(可重複讀取);4、Serializable(可串列化)。

資料庫事務隔離等級有哪些

本教學操作環境:windows7系統、mysql8版本、Dell G3電腦。

在資料庫操作中,一項交易(Transaction)是由一條或多條操作資料庫的 SQL 語句組成的一個不可分割的工作單元,這些操作要么都完成,要么都取消。

資料庫事務隔離等級

在實際應用中,資料庫中的資料是要被多個使用者共同存取的,在多個當使用者同時操作相同的資料時,可能就會出現一些事務的並發問題,具體如下。

1)髒讀

指一個交易讀取到另一個交易未提交的資料。

2)不可重複讀取

指一個交易對同一行資料重複讀取兩次,但得到的結果不同。

3)虛讀/幻讀

指一個交易執行兩次查詢,但第二次查詢的結果包含了第一次查詢中未出現的資料。

4)遺失更新

指兩個事務同時更新一行數據,後提交(或撤銷)的事務將先前事務提交的資料覆蓋了。

遺失更新可分為兩類,分別是第一類遺失更新和第二類遺失更新。

  • 第一類遺失更新是指兩個交易同時操作同一個資料時,當第一個交易撤銷時,把已經提交的第二個交易的更新資料覆蓋了,第二個事務就造成了資料遺失。

  • 第二類遺失更新是指當兩個交易同時操作同一個資料時,第一個交易將修改結果成功提交後,對第二個交易已經提交的修改結果進行了覆蓋,對第二個事務造成了資料遺失。

為了避免上述交易並發問題的出現​​,在標準的 SQL 規範中定義了四種交易隔離級別,不同的隔離級別對交易的處理有所不同。這四種事務的隔離等級如下。

1)Read Uncommitted(讀未提交)

一個交易在執行過程中,既可以存取其他交易未提交的新插入的數據,又可以訪問未提交的修改資料。如果一個事務已經開始寫數據,則另外一個事務不允許同時進行寫入操作,但允許其他事務讀取此行數據。此隔離等級可防止遺失更新。

2)Read Committed(讀已提交)

一個交易在執行過程中,既可以存取其他交易成功提交的新插入的數據,又可以訪問成功修改的數據。讀取資料的事務允許其他事務繼續存取該行數據,但是未提交的寫入事務將會禁止其他事務存取該行。此隔離等級可有效防止髒讀。

3)Repeatable Read(可重複讀取)

一個事務在執行過程中,可以存取其他事務成功提交的新插入的數據,但不可以存取成功修改的資料。讀取資料的事務將會禁止寫入事務(但允許讀取事務),寫事務則禁止任何其他事務。此隔離等級可有效防止不可重複讀取和髒讀。

4)Serializable(可串行化)

提供嚴格的事務隔離。它要求事務序列化執行,事務只能一個接著一個執行,不能並發執行。此隔離等級可有效防止髒讀、不可重複讀取和幻讀。但這個等級可能導致大量的超時現象和鎖競爭,在實際應用中很少使用。

一般來說,交易的隔離等級越高,越能保證資料庫的完整性和一致性,但相對來說,隔離等級越高,對並發效能的影響也越大。因此,通常將資料庫的隔離等級設為 Read Committed,即讀已提交數據,它既能防止髒讀,又能有較好的並發效能。雖然這種隔離等級會導致不可重複讀取、幻讀和第二類遺失更新這些並發問題,但可透過在應用程式中採用悲觀鎖和樂觀鎖加以控制。

相關免費學習推薦:mysql影片教學

#

以上是資料庫事務隔離等級有哪些的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn