MySQL數(shù)據(jù)庫事務(wù)隔離級別介紹(Transaction Isolation Level)
數(shù)據(jù)庫隔離級別有四種,應(yīng)用《高性能mysql》一書中的說明:



然后說說修改事務(wù)隔離級別的方法:
1.全局修改,修改mysql.ini配置文件,在最后加上
#可選參數(shù)有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.
[mysqld]
transaction-isolation = REPEATABLE-READ
這里全局默認(rèn)是REPEATABLE-READ,其實(shí)MySQL本來默認(rèn)也是這個級別
2.對當(dāng)前session修改,在登錄mysql客戶端后,執(zhí)行命令:

要記住mysql有一個autocommit參數(shù),默認(rèn)是on,他的作用是每一條單獨(dú)的查詢都是一個事務(wù),并且自動開始,自動提交(執(zhí)行完以后就自動結(jié)束了,如果你要適用select for update,而不手動調(diào)用 start transaction,這個for update的行鎖機(jī)制等于沒用,因?yàn)樾墟i在自動提交后就釋放了),所以事務(wù)隔離級別和鎖機(jī)制即使你不顯式調(diào)用start transaction,這種機(jī)制在單獨(dú)的一條查詢語句中也是適用的,分析鎖的運(yùn)作的時候一定要注意這一點(diǎn)
再來說說鎖機(jī)制:
共享鎖:由讀表操作加上的鎖,加鎖后其他用戶只能獲取該表或行的共享鎖,不能獲取排它鎖,也就是說只能讀不能寫
排它鎖:由寫表操作加上的鎖,加鎖后其他用戶不能獲取該表或行的任何鎖,典型是mysql事務(wù)中
start transaction;
select * from user where userId = 1 for update;
執(zhí)行完這句以后
1)當(dāng)其他事務(wù)想要獲取共享鎖,比如事務(wù)隔離級別為SERIALIZABLE的事務(wù),執(zhí)行
select * from user;
將會被掛起,因?yàn)镾ERIALIZABLE的select語句需要獲取共享鎖
2)當(dāng)其他事務(wù)執(zhí)行
select * from user where userId = 1 for update;
update user set userAge = 100 where userId = 1;
也會被掛起,因?yàn)閒or update會獲取這一行數(shù)據(jù)的排它鎖,需要等到前一個事務(wù)釋放該排它鎖才可以繼續(xù)進(jìn)行
鎖的范圍:
行鎖: 對某行記錄加上鎖
表鎖: 對整個表加上鎖
這樣組合起來就有,行級共享鎖,表級共享鎖,行級排他鎖,表級排他鎖
下面來說說不同的事務(wù)隔離級別的實(shí)例效果,例子使用InnoDB,開啟兩個客戶端A,B,在A中修改事務(wù)隔離級別,在B中開啟事務(wù)并修改數(shù)據(jù),然后在A中的事務(wù)查看B的事務(wù)修改效果:
1.READ-UNCOMMITTED(讀取未提交內(nèi)容)級別
1)A修改事務(wù)級別并開始事務(wù),對user表做一次查詢

2)B更新一條記錄

3)此時B事務(wù)還未提交,A在事務(wù)內(nèi)做一次查詢,發(fā)現(xiàn)查詢結(jié)果已經(jīng)改變

4)B進(jìn)行事務(wù)回滾

5)A再做一次查詢,查詢結(jié)果又變回去了

6)A表對user表數(shù)據(jù)進(jìn)行修改

7)B表重新開始事務(wù)后,對user表記錄進(jìn)行修改,修改被掛起,直至超時,但是對另一條數(shù)據(jù)的修改成功,說明A的修改對user表的數(shù)據(jù)行加行共享鎖(因?yàn)榭梢允褂胹elect)

可以看出READ-UNCOMMITTED隔離級別,當(dāng)兩個事務(wù)同時進(jìn)行時,即使事務(wù)沒有提交,所做的修改也會對事務(wù)內(nèi)的查詢做出影響,這種級別顯然很不安全。但是在表對某行進(jìn)行修改時,會對該行加上行共享鎖
2. READ-COMMITTED(讀取提交內(nèi)容)
1)設(shè)置A的事務(wù)隔離級別,并進(jìn)入事務(wù)做一次查詢

2)B開始事務(wù),并對記錄進(jìn)行修改

3)A再對user表進(jìn)行查詢,發(fā)現(xiàn)記錄沒有受到影響

4)B提交事務(wù)

5)A再對user表查詢,發(fā)現(xiàn)記錄被修改

6)A對user表進(jìn)行修改

7)B重新開始事務(wù),并對user表同一條進(jìn)行修改,發(fā)現(xiàn)修改被掛起,直到超時,但對另一條記錄修改,卻是成功,說明A的修改對user表加上了行共享鎖(因?yàn)榭梢詓elect)


READ-COMMITTED事務(wù)隔離級別,只有在事務(wù)提交后,才會對另一個事務(wù)產(chǎn)生影響,并且在對表進(jìn)行修改時,會對表數(shù)據(jù)行加上行共享鎖
3. REPEATABLE-READ(可重讀)
1)A設(shè)置事務(wù)隔離級別,進(jìn)入事務(wù)后查詢一次

2)B開始事務(wù),并對user表進(jìn)行修改

3)A查看user表數(shù)據(jù),數(shù)據(jù)未發(fā)生改變

4)B提交事務(wù)

5)A再進(jìn)行一次查詢,結(jié)果還是沒有變化

6)A提交事務(wù)后,再查看結(jié)果,結(jié)果已經(jīng)更新

7)A重新開始事務(wù),并對user表進(jìn)行修改

8)B表重新開始事務(wù),并對user表進(jìn)行修改,修改被掛起,直到超時,對另一條記錄修改卻成功,說明A對表進(jìn)行修改時加了行共享鎖(可以select)


REPEATABLE-READ事務(wù)隔離級別,當(dāng)兩個事務(wù)同時進(jìn)行時,其中一個事務(wù)修改數(shù)據(jù)對另一個事務(wù)不會造成影響,即使修改的事務(wù)已經(jīng)提交也不會對另一個事務(wù)造成影響。
在事務(wù)中對某條記錄修改,會對記錄加上行共享鎖,直到事務(wù)結(jié)束才會釋放。
4.SERIERLIZED(可串行化)
1)修改A的事務(wù)隔離級別,并作一次查詢

2)B對表進(jìn)行查詢,正常得出結(jié)果,可知對user表的查詢是可以進(jìn)行的

3)B開始事務(wù),并對記錄做修改,因?yàn)锳事務(wù)未提交,所以B的修改處于等待狀態(tài),等待A事務(wù)結(jié)束,最后超時,說明A在對user表做查詢操作后,對表加上了共享鎖

SERIALIZABLE事務(wù)隔離級別最嚴(yán)厲,在進(jìn)行查詢時就會對表或行加上共享鎖,其他事務(wù)對該表將只能進(jìn)行讀操作,而不能進(jìn)行寫操作。
相關(guān)文章
數(shù)據(jù)庫性能測試之sysbench工具的安裝與用法詳解
sysbench是一個很不錯的數(shù)據(jù)庫性能測試工具,這篇文章主要給大家介紹了關(guān)于數(shù)據(jù)庫性能測試之sysbench工具的安裝與用法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07
MySQL數(shù)據(jù)庫常用操作技巧總結(jié)
這篇文章主要介紹了MySQL數(shù)據(jù)庫常用操作技巧,結(jié)合實(shí)例形式總結(jié)分析了mysql查詢、存儲過程、字符串截取、時間、排序等常用操作技巧,需要的朋友可以參考下2018-03-03
win10下mysql 5.7.23 winx64安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了win10下mysql 5.7.23 winx64安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-09-09
mysql mysqldump數(shù)據(jù)備份和增量備份
本篇文章主要講如何使用shell實(shí)現(xiàn)mysql全量,增量備份,還可以按時間備份。2013-10-10

