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