第4節講到了事務的隔離級別,1:讀未提交。2:讀提交。3:可重複讀。4:串行化
第6節講到了鎖,1:全局鎖(FTWRL),2:表級鎖(MDL/表鎖)。3:行鎖(InnoDB)。
所以到底我們事務與事務之間的修改到底能不能其他事務看到。
其實我們程序中也有很多這樣的情況,在可重複性讀的隔離級別下開啓事務A,事務B
mysql> CREATE TABLE `t` (
`id` int(11) NOT NULL,
`k` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
insert into t(id, k) values(1,1),(2,2);
事務開啓之後會創建視圖,根據可從重複讀的隔離級別。事務A先創建視圖,視圖編號99,事務B獲取視圖100,事務c獲取視圖101。
執行順序1:事務C。2-事務B。3-事務A。
那麼事務C執行之後,當前視圖的編號更新成了102,
事務B執行之後,當前視圖編號更新成了103,
事務A只有讀操作,當前視圖編號不變還是99
那麼B的讀取結果是K = 3;事務A的結果是k=1;
爲什麼呢,在可重複讀的隔離級別下,事務A的視圖編號是99,只能查詢99之前已經提交的視圖,比如98,97.不能讀取到大於99的編號。
事務B爲什麼能讀取到k=3呢,因爲事務Bupdate之後,自身的視圖編號爲103已經大於C事務的102,且C事務已經提交,那事務B就能讀取到最新的數據。
所以,事務可見性的規則如下:
1:版本未提交,不可見。A不可讀B
2:版本已提交,但是視圖的版本號比當前事務高,不可見。
3:版本已提交,且視圖的版本號比當前事務低,可見。
以上的內容主要學習了 (林曉斌)丁奇的mysql實戰45講的主要內容總結