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)
事務只能一個接著一個地執行,不能併發執行。
解決的問題:可有效防止髒讀、不可重複讀和幻讀。
但這個級別可能導致大量的超時現象和鎖競爭,在實際應用中很少使用。
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