資料庫事務的四大特性和隔離級別

淵渟嶽發表於2022-01-03

1.簡介

1.1.事務是什麼

事務(Transaction)是由一條或多條運算元據庫的 SQL 語句組成的一個不可分割的工作單元,這些操作要麼都完成,要麼都回滾。一個事務往往對應一個完整的業務。

1.2.事務關鍵流程

2.事務四大特性(ACID)

2.1.原子性(atomicity)

事務是個完整體,不可再分(就像化學中的原子不可再分),要求所有DML語句操作必須同時成功或同時失敗。

2.2.一致性(consistency)

事務前後的資料要保持一致。 如:A有10元錢,B有20元錢。B轉10元給A,完成轉賬後A+B的錢還是30元。

2.3.隔離性( isolation )

不同的事務之間互相隔離。

2.4.永續性(durability)

事務結束後,記憶體資料持久化的磁碟中。

3.併發問題

3.1.兩種資料丟失

第一種是指兩個事務同時操作同一個資料時,當第一個事務回滾時,把已經提交的第二個事務的更新資料覆蓋了,第二個事務就造成了資料丟失。

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

3.2.髒讀

髒讀是指一個事務讀取了另一個未提交事務的資料。

如:事務A讀取了事務B未提交的資料,假如事務B未正確執行,回滾,則事務A讀取到的就是髒資料。

問題關鍵點:讀了未提交事務的資料。

3.3.不可重複讀

不可重複讀是指一個事務對同一行資料重複讀取兩次,但得到的結果內容不同。

如:一個事務執行過程中,另一事務提交併修改了當前事務正在讀取的資料

問題關鍵點:同一個事務多次讀條件相同的資料,其他事務還可以修改該條件下的資料。

3.4.幻讀

幻讀是同一個事務的相同的兩次查詢的結果數不一致。

如:一個事務執行過程中,另一個事務新增或刪除了資料,導致兩次相同的查詢結果條數不同。

問題關鍵點:同一個事務多次讀條件相同的資料,其他事務還可以新增或刪除該條件下的資料。

解決問題?

4.隔離級別

事務分為兩種:讀事務和寫事務。

4.1.讀未提交(Read UnCommitted)

  • 多個事務能同時讀未提交的資料
  • 一個事務讀的時候其他事務還可以寫
  • 一個事務寫的時候其他事務還可以讀
  • 但不能同時寫

解決的問題:可防止丟失更新

4.2.讀已提交(Read Committed)

  • 多個事務能同時讀已提交的資料
  • 一個事務讀的時候其他事務還可以寫
  • 一個事務寫的時候其他事務禁止所有操作
  • 但不能同時寫

解決的問題:可有效防止髒讀。

4.3.可重複讀(Repeatable Read)

  • 多個事務能同時讀已提交的插入資料,不能讀已提交的修改資料
  • 一個事務讀的時候其他事務只能讀禁止寫
  • 一個事務寫的時候其他事務禁止所有操作
  • 但不能同時寫

解決的問題:可有效防止不可重複讀和髒讀(InnoDB儲存引擎還解決了幻讀問題)。

4.4.序列化(Serializable)

  • 事務只能一個接著一個地執行,不能併發執行。

解決的問題:可有效防止髒讀、不可重複讀和幻讀。

但這個級別可能導致大量的超時現象和鎖競爭,在實際應用中很少使用。
img

5.事務的一些常用操作

5.1.設定事務自動提交

--檢視當前會話
show session variables like 'autocommit';
--檢視全域性會話
show global variables like 'autocommit';
--設定當前會話
set session autocommit = 0|1|ON|OFF;
--設定全域性會話
set global autocommit = 0|1|ON|OFF;

選項:0|1|ON|OFF

  • 關閉:0 和 OFF
  • 開啟:1 和 ON

5.2.設定隔離級別

--檢視當前會話
select @@tx_isolation;
select @@session.tx_isolation;
--檢視全域性會話
select @@global.tx_isolation;
show global variables like 'tx_isolation';
--設定當前會話
set tx_isolation='隔離級別';
--設定全域性會話
set global transaction isolation level 隔離級別;

隔離級別

  • read uncommitted
  • read committed
  • repeatable read
  • serializable

6.總結

一般來說,事務的隔離級別越高,越能保證資料庫的完整性和一致性,但相對來說,隔離級別越高,對併發效能的影響也越大。官方預設使用可重複讀(Repeatable Read) 但也可以將資料庫的隔離級別設定為讀已提交(Read Committed),即能防止髒讀,又能有較好的併發效能,關於不可重複讀、幻讀和第二類資料丟失這些併發問題,可通過在應用程式中採用悲觀鎖和樂觀鎖加以控制。

關注閱讀更多優質文章? 獲取思維導圖?公眾號輸入:dt0010

相關文章