8.2 快照讀,當前讀

weixin_34393428發表於2019-02-22

當前讀

這些是當前讀:

select...lock in share mode (就這個是共享鎖)
select...for update
update , delete , insert

當前讀, 就是加了鎖
讀取的是最新版本, 並且對讀取的記錄加鎖, 不讓其他事務同時去改(其他事務要阻塞下)


4930604-b82be18de16c1111.png
update執行過程,insert和delete也一樣

快照讀:

普通select時是,
基於提升併發的考慮,
基於MVCC多版本併發控制(行鎖的變種)
改進成不加鎖了(除非是隔離級別是序列),
讀的是檢視, 不是最新資料

如果先select 再update 可能會看到幻行, 因為select讀的可能是老的版本, 有其他事務插入或者刪除過行,所以和更新讀到的最新版本行數不一樣

讀已提交

select (快照讀)
select...lock in share mode(當前讀)
結果是一樣的
因為快照讀, 採納的是這之前提交的最後版本
當前讀 是讀的最新版本
是同一版本

重複讀

select (快照讀): 快照讀的版本
select...lock in share mode(當前讀) : 最新版本
結果可能不同, 後者可能更新
即使有過當前讀, 再快照讀, 也還是讀快照

undo log:

每行除了資料外 還有
DB_TRX_ID: 最後更新的事務id(update,delete,insert)
DB_ROLL_PTR: 回滾指標, 指向前一個版本 , 組成 undo 鏈
DB_ROW_ID: 行id的值 自增

  • insert undo log: 只在事務回滾時需要, 事務提交就可以刪掉了
  • update undo log: 包括update 和 delete , 回滾和快照讀 都需要
4930604-5618611d9e5b1f1d.png
undo log

開始只有最下面一行,
事務1 先排他鎖鎖住它(當前讀,讀到最新資料然後獨佔),複製到第二行,更新欄位, 把自己的id填入DB_TRX_ID, 讓DB_ROLL_PTR 指向原資料
事務2也有一樣, 產生的第三行

相關文章