原文來(lái)自極客時(shí)間,?第八講:事務(wù)隔離[mysql實(shí)戰(zhàn)45講]
一:總括:?
? ? 1. begin / start transaction 并不是事務(wù)起點(diǎn), 而是他們之后的第一個(gè)操作innodb表的語(yǔ)句.?
? ? 2. 馬上啟動(dòng)事務(wù) : start transaction with consistent snapshot
? ? 3. 事務(wù)A看的到k 是1;? 因?yàn)橐恢滦砸晥D在start transaction whit consistent snapshot時(shí)創(chuàng)建;?
? ? 4. 事務(wù)B看到的k 是 2:? 因?yàn)?事務(wù)C是最先提交的, update有排他鎖, 所以事務(wù)B的update 和事務(wù)CD的update沖突了,? ==> 有疑問(wèn)!??
二: "快照"在MVCC中是怎么工作的 ?
1.疑問(wèn): 什么是MVCC ?? ? ?==>?Multi-Version Concurrency Control 多版本并發(fā)控制
? ? 1: MVCC步驟:?
? ? ? ? 1.事務(wù)啟動(dòng)時(shí), 創(chuàng)建快照; 基于整個(gè)庫(kù)
? ? ? ? ? ? ? ? 唯一的事務(wù)id ==> transaction id
? ? ? ? ? ? ? ? 數(shù)據(jù)版本的事務(wù)ID ==> row trx_id
名詞解釋:?
1.事務(wù)ID : 唯一的, 遞增的
2.一致性視圖數(shù)組 read - view : 保存事務(wù)啟動(dòng)瞬間"活躍"的事務(wù)ID, 由高水位, 低水位組成.?
3.活躍: 啟動(dòng)但未提交
4: 低水位: 數(shù)組中事務(wù)ID最小值
5: 高水位: 當(dāng)前系統(tǒng)創(chuàng)建過(guò)的事務(wù)ID最大值
? ? 注意: 獲取視圖數(shù)組高低水位, 是原子操作,期間不能創(chuàng)建新事務(wù).
6:row trx_id: 行數(shù)據(jù)版本, 哪個(gè)事務(wù)更新了該行,則把事務(wù)ID賦給row trx_id
? ? ==> 既: row trx_id? =? 最新更新該行的事務(wù)ID
7.數(shù)據(jù)版本的可見性規(guī)則: read - view 和 row trx_id 對(duì)比得出.
疑問(wèn)1: 3.b的具體場(chǎng)景是什么樣的? ==> 圖3畫的不對(duì).?
總結(jié)1 事務(wù)視圖(一致性讀) :?
? ? 1. 版本未提交, 不可見.?
? ? 2. 版本已提交, 但是在視圖創(chuàng)建后提交的, 不可見;
? ? 3. 版本已提交, 是在視圖創(chuàng)建前提交的, 可見.
? ? 4.自己的更新, 可見.?
總結(jié)2: select 是一致性讀:?
三: 更新邏輯
????規(guī)則1: 更新數(shù)據(jù)都是先讀后寫, 這個(gè)讀就是當(dāng)前讀 current read
????適用范圍: update 語(yǔ)句 ,? 加鎖的select 語(yǔ)句
? ? 推導(dǎo)1 : 如果事務(wù)C不馬上提交, 則需要用到兩階段鎖協(xié)議, 事務(wù)B的update 和select 會(huì)被阻塞.
????總結(jié)3:update 是當(dāng)前讀.?
疑問(wèn)2: 那insert? 和delete 呢 ??
????結(jié)論4: 可重復(fù)讀的核心是一致性讀 consistent read
四: 可重復(fù)讀 和 讀提交的區(qū)別:?
? ? 可重復(fù)讀: 事務(wù)開始時(shí)創(chuàng)建一致性視圖;
? ? 讀提交: 每一個(gè)語(yǔ)句執(zhí)行前,重新算一個(gè)新視圖.?