數據庫事務隔離級別有哪些

數據庫事務隔離級別: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視頻教程

? 版權聲明
THE END
喜歡就支持一下吧
點贊6 分享