超詳細的事務四大特性、隔離級別解讀(帶SQL語句)

事務的四大特性 ACID
原子性:事務的所有操作要么全部成功,要么全部失敗回滾。
一致性:事務必須是使數據庫從一個一致性狀態變到另一個一致性狀態。
隔離性:一個事務的執行不受其他事務的干擾。
持久性:一個事務一旦被提交了,那么對數據庫中的數據的改變就是永久性的,即便是在數據庫系統遇到故障的情況下也不會丟失提交事務的操作。
隔離級別產生問題
臟讀:在一個事務處理過程里讀取了另一個未提交的事務中的數據(未提交意味著這些數據可能會回滾,可能最終不會存到數據庫)。
不可重復讀:不可重復讀是指在對于數據庫中的某個數據,一個事務范圍內多次查詢卻返回了不同的數據值,這是由于在查詢間隔,被另一個事務修改并提交了,讀取了前一個事務提交的數據。
幻讀:事務在檢索期間,其它事務對數據執行了操作,導致前后兩次檢索的數據不一樣。
例如:事務1對一個表中所有數據某個字段值從“Y”修改為“N”的操作,這時事務2又對這個表中插入了一行數據,而這個數據的字段值是為“Y”。事務1如果再查看剛剛修改的數據,會發現還有一行沒有修改,其實這行是事務2中添加的,就好像產生幻覺一樣,這就是發生了幻讀。
幻讀和不可重復讀都是讀取了另一條已經提交的事務(這點就臟讀不同),所不同的是不可重復讀查詢的都是同一個數據項,而幻讀針對的是一批數據整體(比如數據的個數)。
MySQL數據庫的四種事務隔離級別(從低到高)
Read Uncommitted(讀未提交):所有事務都可以看到其他未提交事務的執行結果。(基本上沒用)。
Read Committed(讀已提交):一個事務只能看見已經提交事務所做的改變。
Repeatable Read(可重讀):確保同一事務的多個實例在并發讀取數據時,會看到同樣的數據行。(MySQL的默認事務隔離級別)
Serializable(可串行化):通過強制事務排序,使之不可能相互沖突,從而解決幻讀問題。
隔離級別 | 臟讀 | 不可重復讀 | 幻讀 |
讀未提交 | 不能避免 | 不能避免 | 不能避免 |
讀已提交 | 能避免 | 不能避免 | 不能避免 |
可重讀 | 能避免 | 能避免 | 不能避免 |
可串行化 | 能避免 | 能避免 | 能避免 |
查看mySQL的數據庫隔離級別
先看下mysql版本,執行對應sql語句。
-- 查看版本
select version();
-- 舊版本也就是5.x
select @@tx_isolation;
-- 新版本
select @@transaction_isolation;
查詢mysql版本

查詢mysql的隔離級別
-- 設置read uncommitted級別:
set session transaction isolation level read uncommitted;
-- 設置read committed級別:
set session transaction isolation level read committed;
-- 設置repeatable read級別:
set session transaction isolation level repeatable read;
-- 設置serializable級別:
set session transaction isolation level serializable;





















