《mysql基礎》7-事務的可見性

第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講的主要內容總結

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章