今天在學習JDBC的時候看到了關于MySql的事務的隔離級别的問題,感覺内容挺進階的,是以記錄一篇文章,以備後面使用。
資料庫隔離級别有四種,應用《高性能mysql》一書中的說明:

然後說說改動事務隔離級别的方法:
1.全局改動,改動mysql.ini配置檔案。在最後加上
1 #可選參數有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.
2 [mysqld]
3 transaction-isolation = REPEATABLE-READ
這裡全局預設是REPEATABLE-READ,事實上MySQL本來預設也是這個級别
2.對目前session改動。在登入mysqlclient後,運作指令:
set session transaction isolation level read uncommitted;
要記住mysql有一個autocommit參數。預設是on。他的作用是每一條單獨的查詢都是一個事務。而且自己主動開始。自己主動送出(運作完以後就自己主動結束了。假設你要适用select for update。而不手動調用 start transaction,這個for update的行鎖機制等于沒用。由于行鎖在自己主動送出後就釋放了)。是以事務隔離級别和鎖機制即使你不顯式調用start transaction,這樣的機制在單獨的一條查詢語句中也是适用的,分析鎖的運作的時候一定要注意這一點
再來說說鎖機制:
共享鎖:由讀表操作加上的鎖。加鎖後其它使用者僅僅能擷取該表或行的共享鎖,不能擷取排它鎖,也就是說僅僅能讀不能寫
排它鎖:由寫表操作加上的鎖,加鎖後其它使用者不能擷取該表或行的不論什麼鎖。典型是mysql事務中
start transaction;
select * from user where userId = 1 for update;
運作完這句以後
1)當其它事務想要擷取共享鎖,比方事務隔離級别為SERIALIZABLE的事務,運作
select * from user;
将會被挂起。由于SERIALIZABLE的select語句須要擷取共享鎖
2)當其它事務運作
select * from user where userId = 1 for update;
update user set userAge = 100 where userId = 1;
也會被挂起。由于for update會擷取這一行資料的排它鎖,須要等到前一個事務釋放該排它鎖才幹夠繼續進行
鎖的範圍:
行鎖: 對某行記錄加上鎖
表鎖: 對整個表加上鎖
這樣組合起來就有,行級共享鎖,表級共享鎖,行級排他鎖,表級排他鎖
以下來說說不同的事務隔離級别的執行個體效果,樣例使用InnoDB。開啟兩個clientA。B,在A中改動事務隔離級别,在B中開啟事務并改動資料,然後在A中的事務檢視B的事務改動效果(兩個client相當于是兩個連接配接。在一個client中的改動參數變量的值是不會影響到另外的一個client的):
1.READ-UNCOMMITTED(讀取未送出内容)級别
1)A改動事務級别并開始事務,對user表做一次查詢
2)B更新一條記錄
3)此時B事務還未送出,A在事務内做一次查詢。發現查詢結果已經改變
4)B進行事務復原
5)A再做一次查詢。查詢結果又變回去了
6)A表對user表資料進行改動
7)B表又一次開始事務後,對user表記錄進行改動,改動被挂起,直至逾時,可是對還有一條資料的改動成功。說明A的改動對user表的資料行加行共享鎖(由于能夠使用select)
能夠看出READ-UNCOMMITTED隔離級别。當兩個事務同一時候進行時,即使事務沒有送出,所做的改動也會對事務内的查詢做出影響,這樣的級别顯然非常不安全。可是在表對某行進行改動時,會對該行加上行共享鎖
2. READ-COMMITTED(讀取送出内容)
1)設定A的事務隔離級别。并進入事務做一次查詢
2)B開始事務。并對記錄進行改動
3)A再對user表進行查詢,發現記錄沒有受到影響
4)B送出事務
5)A再對user表查詢。發現記錄被改動
6)A對user表進行改動
7)B又一次開始事務,并對user表同一條進行改動,發現改動被挂起,直到逾時。但對還有一條記錄改動,卻是成功,說明A的改動對user表加上了行共享鎖(由于能夠select)
READ-COMMITTED事務隔離級别,僅僅有在事務送出後,才會對還有一個事務産生影響,而且在對表進行改動時。會對表資料行加上行共享鎖
3. REPEATABLE-READ(可重讀)
1)A設定事務隔離級别,進入事務後查詢一次
2)B開始事務,并對user表進行改動
3)A檢視user表資料,資料未發生改變
4)B送出事務
5)A再進行一次查詢,結果還是沒有變化
6)A送出事務後,再檢視結果,結果已經更新
7)A又一次開始事務,并對user表進行改動
8)B表又一次開始事務,并對user表進行改動,改動被挂起,直到逾時,對還有一條記錄改動卻成功。說明A對表進行改動時加了行共享鎖(能夠select)
REPEATABLE-READ事務隔離級别,當兩個事務同一時候進行時,當中一個事務改動資料對還有一個事務不會造成影響,即使改動的事務已經送出也不會對還有一個事務造成影響。
在事務中對某條記錄改動,會對記錄加上行共享鎖,直到事務結束才會釋放。
4.SERIERLIZED(可串行化)
1)改動A的事務隔離級别,并作一次查詢
2)B對表進行查詢,正常得出結果。可知對user表的查詢是能夠進行的
3)B開始事務,并對記錄做改動。由于A事務未送出。是以B的改動處于等待狀态,等待A事務結束。最後逾時,說明A在對user表做查詢操作後,對表加上了共享鎖
SERIALIZABLE事務隔離級别最嚴厲,在進行查詢時就會對表或行加上共享鎖。其它事務對該表将僅僅能進行讀操作。而不能進行寫操作。