mysql數(shù)據(jù)庫隔離級(jí)別詳解
隔離級(jí)別
一、mysql有四個(gè)事務(wù)隔離級(jí)別
每個(gè)級(jí)別都有字符或數(shù)字編號(hào)
- 讀未提交 READ UNCOMMITTED | 0 : 存在臟讀,不可重復(fù)度,幻讀的問題。
- 讀已提交 READ COMMITTED | 1 : 解決臟讀問題,存在不可重復(fù)讀,幻讀的問題。
- 可重復(fù)讀 REPEATABLE READ | 2 : 解決臟讀,不可重復(fù)讀的問題,存在幻讀,默認(rèn)隔離級(jí)別,使用MVCC機(jī)制實(shí)現(xiàn)可重復(fù)讀。
- 序列化 SERIALIZABLE | 3 : 解決臟讀,不可重復(fù)讀,幻讀,可保證事務(wù)安全,但完全串行執(zhí)行,性能最低。
我有記憶方法,先是RU、RC, 記住UC順序,聯(lián)想到UC WEB。
二、為什么默認(rèn)RR隔離級(jí)別?
RR級(jí)別作為mysql事務(wù)默認(rèn)隔離級(jí)別,是事務(wù)完全和性能的折中。SERIALIZABLE級(jí)別是悲觀地認(rèn)為幻讀時(shí)刻都會(huì)發(fā)生,故會(huì)自動(dòng)地隱式地對(duì)事務(wù)所需資源加排他鎖,其他事務(wù)訪問此資源會(huì)被阻塞等待,故事務(wù)是安全的,但需要認(rèn)值考慮性能。
三、RR隔離級(jí)別下手動(dòng)加鎖解決幻讀理論基礎(chǔ)
InnoDB的行鎖鎖定的是索引,而不是記錄本身。索引映射的記錄存在就加行鎖,如果不存在則會(huì)加next-key lock/gap鎖/間隙鎖, 故InnoDB可以實(shí)現(xiàn)事務(wù)對(duì)某記錄的預(yù)先占用。
臟讀、不可重復(fù)讀、幻讀 及其解決方法
臟讀
- 一個(gè)事務(wù)讀取到另一個(gè)事務(wù)還沒有提交的數(shù)據(jù)。解決方法:把事務(wù)隔離級(jí)別調(diào)整到READ COMMITTED。
不可重復(fù)讀
- 一個(gè)事務(wù)先后讀取同一條記錄,但兩次讀取的數(shù)據(jù)不同,我們稱之為不可重復(fù)讀。解決方法:把事務(wù)隔離級(jí)別調(diào)整到REPEATABLE READ。
幻讀
- 網(wǎng)上很多文章都說一個(gè)事務(wù)執(zhí)行范圍查詢,兩次select得到的條數(shù)不同,就叫幻讀,這是錯(cuò)誤的?。。?/li>
- 幻讀并不是說兩次讀取獲取的結(jié)果集不同,幻讀是指某一次select操作得到的結(jié)果所表征的數(shù)據(jù)狀態(tài)無法支持后續(xù)的業(yè)務(wù)操作,具體例子:select某記錄是否存在,不存在,準(zhǔn)備插入此記錄,但執(zhí)行insert時(shí)發(fā)現(xiàn)此記錄已存在,無法插入,此時(shí)就發(fā)生了幻讀。
- 還一種理解思路,就是因?yàn)橄炔捎昧?quot;快照讀",然后又用了"當(dāng)前讀",發(fā)現(xiàn)結(jié)果不同。比如先select是快照讀,然后update、insert等,這時(shí)會(huì)用到當(dāng)前讀,發(fā)現(xiàn)操作出現(xiàn)未預(yù)料結(jié)果。
幻讀解決方法
1、把事務(wù)隔離級(jí)別調(diào)整到SERIALIZABLE。2、RR隔離級(jí)別下,對(duì)select操作手動(dòng)加行鎖,select ... for update,這也序列化隔離級(jí)別下隱式會(huì)做的事。
參考文章
事務(wù)隔離級(jí)別命令行操作
1、查看隔離級(jí)別
1)查看當(dāng)前會(huì)話隔離級(jí)別
mysql> SELECT @@tx_isolation; +-----------------+ | @@tx_isolation | +-----------------+ | REPEATABLE-READ | +-----------------+ 1 row in set, 1 warning (0.00 sec)
2)查看系統(tǒng)隔離級(jí)別
mysql> select @@global.tx_isolation; +-----------------------+ | @@global.tx_isolation | +-----------------------+ | READ-UNCOMMITTED | +-----------------------+ 1 row in set, 1 warning (0.00 sec)
2、設(shè)置隔離級(jí)別
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]
1)設(shè)置當(dāng)前會(huì)話
mysql> set session transaction isolation level repeatable read; Query OK, 0 rows affected (0.00 sec)
2)設(shè)置系統(tǒng)
mysql> set global transaction isolation level read uncommitted; Query OK, 0 rows affected (0.00 sec)3、命令行,開始事務(wù)時(shí)用
操作驗(yàn)證
自己在命令行去驗(yàn)證幾種隔離級(jí)別下的讀問題。
一、實(shí)現(xiàn)臟讀
在不可提交讀, 也就是READ UNCOMMITED情況下,會(huì)產(chǎn)生臟讀。
二、操作驗(yàn)證--實(shí)現(xiàn)不可重復(fù)讀
在可提交讀, 也就是READ COMMITED情況下,會(huì)產(chǎn)生不可重復(fù)讀。
三、操作驗(yàn)證--解決不可重復(fù)讀
repeatable read(MySQL默認(rèn)隔離級(jí)別),這時(shí)候能解決可重復(fù)讀。
右邊事務(wù)提交了,修改了age=29,左邊再次查詢,還是28。
四、操作驗(yàn)證--實(shí)現(xiàn)幻讀
repeatable read(MySQL默認(rèn)隔離級(jí)別),這時(shí)候還會(huì)出現(xiàn)幻讀。
總結(jié)
到此這篇關(guān)于mysql數(shù)據(jù)庫隔離級(jí)別文章就介紹到這了,更多相關(guān)mysql隔離級(jí)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在WIN命令提示符下mysql 用戶新建、授權(quán)、刪除,密碼修改
一般情況下,修改MySQL密碼,授權(quán),是需要有mysql里的root權(quán)限的,本操作是在WIN命令提示符下,感興趣的朋友可以參考下2013-11-11mysql無法啟動(dòng)服務(wù)及其他問題總結(jié)
MySQL無法啟動(dòng),可能有多種原因?qū)е?本文主要介紹了mysql無法啟動(dòng)服務(wù)及其他問題總結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01MySQL5.7.24版本的數(shù)據(jù)庫安裝過程圖文詳解
這篇文章主要介紹了MySQL5.7.24版本的數(shù)據(jù)庫安裝過程,需要的朋友可以參考下2018-11-11MySQL 創(chuàng)建索引(Create Index)的方法和語法結(jié)構(gòu)及例子
MySQL 創(chuàng)建索引(Create Index)的方法和語法結(jié)構(gòu)及例子2009-07-07MySql中having字句對(duì)組記錄進(jìn)行篩選使用說明
having字句可以讓我們篩選成組后的各種數(shù)據(jù)2012-12-12navicat連接mysql修改root密碼最簡(jiǎn)潔方法
這篇文章主要介紹了navicat連接mysql修改root密碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05