蘭州網(wǎng)站建設(shè)公司排名網(wǎng)絡(luò)營銷推廣的渠道有哪些
事務(wù)的隔離級別:
ⅰ. 讀未提交
ⅱ. 對已提交 (解決 臟讀)
ⅲ. 可重復(fù)讀 (解決 不可重復(fù)讀)
ⅳ. 串行化 (解決 臟讀 不可重復(fù)讀 幻讀 問題 )
隔離級別分類如下,在不同的隔離級別下可能產(chǎn)生不同的問題,如臟讀、不可重復(fù)度、幻讀等,我們會在后邊的課程中一一講解:隔離級別 臟讀 不可重復(fù)讀 幻讀 解決方案
Read uncommitted(讀未提交) √ √ √
Read committed(讀已提交) × √ √ undo log
Repeatable read(可重復(fù)讀) × × √ MVCC版本控制+間隙鎖(mysql的rr不存在幻讀)
Serializable(串行化) × × ×
show variables like 'transaction_isolation'; # 查看mysql 事務(wù)的隔離級別變量
在mysql中查看和設(shè)置【事務(wù)的隔離級別】,語法如下:
-- 查看全局和當(dāng)前事務(wù)的隔離級別
SELECT @@global.transaction_isolation, @@transaction_isolation_isolation;
show variables like 'transaction_isolation';
--5.7 tx_isolation
--8.0 transaction_isolation-- 設(shè)置下一個事務(wù)的隔離級別
SET transaction isolation level read uncommitted;
SET transaction isolation level read committed;
set transaction isolation level repeatable read;
SET transaction isolation level serializable;
-- 設(shè)置當(dāng)前會話的隔離級別
SET session transaction isolation level read uncommitted;
SET session transaction isolation level read committed;
set session transaction isolation level repeatable read;
SET session transaction isolation level serializable;
-- 設(shè)置全局事務(wù)的隔離級別
SET GLOBAL transaction isolation level read uncommitted;
SET GLOBAL transaction isolation level read committed;
set GLOBAL transaction isolation level repeatable read;
SET GLOBAL transaction isolation level serializable;其中,SESSION 和 GLOBAL 關(guān)鍵字用來指定修改的事務(wù)隔離級別的范圍:
SESSION:表示修改的事務(wù)隔離級別將應(yīng)用于當(dāng)前 session(當(dāng)前 cmd 窗口)內(nèi)的所有事務(wù);
GLOBAL:表示修改的事務(wù)隔離級別將應(yīng)用于所有 session(全局)中的所有事務(wù),且當(dāng)前已經(jīng)存在的 session 不受影響;
如果省略 SESSION 和 GLOBAL,表示修改的事務(wù)隔離級別將應(yīng)用于當(dāng)前 session 內(nèi)的下一個還未開始的事務(wù)。
ⅴ. #1、讀未提交(RU)
【ru隔離級別】說的簡單一點就是,一個事務(wù)可以讀取其他【未提交的事務(wù)】修改的數(shù)據(jù),
這種隔離級別最低,一般情況下,數(shù)據(jù)庫隔離級別都要高于該級別,該隔離級別下,可能會存在臟讀、
不可重復(fù)度,幻讀的問題。
**臟讀:**指的是一個事務(wù)讀到了其他事務(wù)未提交的數(shù)據(jù),未提交意味著這些數(shù)據(jù)可能會回滾,
讀到的數(shù)據(jù)不一定準(zhǔn)確。
案例:
模擬轉(zhuǎn)賬
使用兩個窗口,開啟兩個事務(wù),且將隔離級別設(shè)置為RU(讀未提交)。
1. 讀未提交 情況:
事務(wù)2 讀取到了事務(wù) 1 未提交的數(shù)據(jù) (id= 2行數(shù)據(jù)) 當(dāng) 事務(wù)1 回滾后 id=2 數(shù)據(jù) 重新 恢復(fù)
事務(wù) 1
事務(wù) 2
ⅵ. 、讀已提交(RC)
【RC讀已提交】說的是當(dāng)前事務(wù)只能讀到別的事物已經(jīng)提交的數(shù)據(jù),該隔離級別可能會產(chǎn)生不可重復(fù)讀和幻讀。
【不可重復(fù)讀】的官方解釋是:【一個事務(wù)】(A事務(wù))修改了【另一個未提交事務(wù)】(B事務(wù))讀取過的數(shù)據(jù)。那么B事務(wù)【再次讀取】,會發(fā)現(xiàn)兩次讀取的數(shù)據(jù)不一致。也就是說在一個原子性的操作中一個事務(wù)兩次讀取相同的數(shù)據(jù),卻不一致,一行數(shù)據(jù)不能重復(fù)被讀取。主要是【update】語句,會導(dǎo)致不可重復(fù)讀。
案例:
- 修改事務(wù) 的隔離級別 為 read commit;
事務(wù)1 可以看到 在同一個事務(wù)中 有不同的 讀取 結(jié)果 即為 不可重復(fù)讀
原因是在另一個事務(wù)中提交了 數(shù)據(jù)的修改
當(dāng)隔離級別設(shè)置為Read committed 時,避免了臟讀,但是可能會造成不可重復(fù)讀。
大多數(shù)數(shù)據(jù)庫的默認(rèn)級別就是Read committed,比如Sql Server , Oracle。如何解決不可重復(fù)讀這一問題,請看下一個隔離級別。
ⅶ. 3、可重復(fù)讀(RR)
學(xué)習(xí)完不可重復(fù)讀,理解【可重復(fù)讀】就簡單多了,他的意思是,同一個事務(wù)中發(fā)出同一個SELECT語句【兩次或更多次】,那么產(chǎn)生的結(jié)果數(shù)據(jù)集總是相同的,在RR隔離級別中可能出現(xiàn)幻讀。
**幻讀:**一個事務(wù)按照某些條件進(jìn)行查詢,事務(wù)提交前,有另一個事務(wù)插入了滿足條件的其他數(shù)據(jù),再次使用相同條件查詢,卻發(fā)現(xiàn)多了一些數(shù)據(jù),就像出現(xiàn)了幻覺一樣?;米x主要針對針對delete和insert語句。
不可重復(fù)讀強調(diào)的是兩次讀取的數(shù)據(jù)【內(nèi)容不同】,幻讀前調(diào)的是兩次讀取的【行數(shù)不同】。
案例
- 設(shè)置 事務(wù)的隔離級別
在 一個事務(wù)中 插入一行數(shù)據(jù),但在另一個數(shù)據(jù)中卻查不到 ,可以看到在可重復(fù)讀的隔離級別中,
幻讀問題是得到一定解決的。
但當(dāng)我 們在 同一個事務(wù)中 更新 一下,再查詢一下時我們發(fā)現(xiàn)了 一個牛逼的現(xiàn)象, 我們在另一個事務(wù)中添加的數(shù)據(jù)出現(xiàn)了 ,幻讀問題出現(xiàn)。
*注意:**在mysql中的RR隔離級別中,innodb使用mvcc+鎖幫我們解決了絕大部分的幻讀情況,上邊的例子稍微修改一下,我們就能看到幻讀現(xiàn)象了。
ⅷ. 4、串行化 (相當(dāng)于給每張表上了一個寫鎖)
- 事務(wù)A和事務(wù)B,事務(wù)A在操作數(shù)據(jù)庫時,事務(wù)B只能排隊等待
- 這種隔離級別很少使用,吞吐量太低,用戶體驗差
這種級別可以避免“幻讀”,每一次讀取的都是數(shù)據(jù)庫中真實存在數(shù)據(jù),事務(wù)A與事務(wù)B串行,而不發(fā)。