標籤:問題 共用鎖定 lan col 刪除 -- 取資料 就會 mysql隔離等級
Mysql提供了4中隔離等級,在介紹這4中隔離等級前,先針對涉及的術語進行說明:
1》、髒讀:一個事務讀取另外一個事務還沒有提交的資料叫髒讀【針對未提交的資料】
2》、不可重複讀取:即在同一個事務內,兩個相同的查詢返回了不同的結果【讀取資料本身的對比】
案例:設定事務的隔離等級讀提交:set session transaction isolation level read committed; 查看交易隔離等級:select @@tx_isolation;
設定自動認可:SET AUTOCOMMIT=0;
表tms_message_info資料:
ID file_name
1 1111.SND
2 2222.SND
| 事務A READ-COMMITTED |
事務B READ-COMMITTED |
start transaction; select * from tms_message_info where id=‘1‘ |
start transaction;-- 開啟事務 update tms_message_info set FILE_NAME=‘666.SND‘ where ID=‘1‘; 未提交 |
| B事務未提交前,A事務執行上述查詢,得到的檔案名稱結果為1111.SND |
commit; B 事務提交 |
| B事務提交後,A事務在執行查詢,結果發生變化,檔案名稱變為666.SND,即同一事務查詢結果不同,即不可重複讀取 |
|
3》、幻讀:即解決了不重複讀,保證了同一個事務裡,查詢的結果都是事務開始時的狀態(一致性),因此同一個事務同樣的SELECT操作讀到的結果會是一致的,但是,如果另一個事務同時提交了新資料或刪除資料,本事務再更新時,就會“驚奇的”發現了這些新增或缺少資料,貌似之前讀到的資料是“鬼影”一樣的幻覺【同一事務A多次查詢,若另一事務B只是update,則A事務多次查詢結果相同;若B事務insert/delete資料,則A事務多次查詢就會發現新增或缺少資料,出現幻讀,即幻讀關注讀取結果集條數變化】
1、讀不提交(Read Uncommited,RU)
這種隔離等級下,事務間完全不隔離,會產生髒讀,可以讀取未提交的記錄,實際情況下不會使用。
2、讀提交(Read commited,RC)
本事務讀取到的是最新的資料(其他事務提交後的)。問題是,在同一個事務裡,前後兩次相同的SELECT會讀到不同的結果(不重複讀)
3、可重複讀(Repeatable Read,RR)【MySQL 預設的層級】
在同一個事務裡,SELECT的結果是事務開始時時間點的狀態,因此,同一個事務同樣的SELECT操作讀到的結果會是一致的。但是,會有幻讀現象
4、 序列化(SERIALIZABLE)。讀操作會隱式擷取共用鎖定,可以保證不同事務間的互斥
隔離等級越高,並發性越差
Mysql隔離等級