MySQL 2 事務隔離級別的實現

2021-10-13 19:05:22 字數 2658 閱讀 2274

2 mysql 中事務隔離級別的實現

3 next-key locks

多版本併發控制(multi-version concurrency control, mvcc)以樂觀鎖為理論基礎,和基於鎖的併發控制最大的區別和優點是:讀不加鎖,讀寫不衝突

mvcc 將每乙個更新的資料標記乙個版本號,在更新時進行版本號的遞增,插入時新建乙個版本號,同時舊版本資料儲存在 undo 日誌中,該日誌通過回滾指標把乙個資料行(record)的所有快照連線起來。

1 快照讀

快照讀只是針對於目標資料的版本號小於等於當前事務的版本號,也就是說讀資料的時候可能讀到舊資料,但是這種快照讀不需要加鎖。也就是說,使用 mvcc 讀取的是快照中的資料,這樣可以減少加鎖所帶來的開銷。

select

*from

table..

.;

2 當前讀當前讀是讀取當前資料的最新版本,但是更新等操作會對資料加鎖,所以當前讀需要獲取記錄的行鎖,存在鎖爭的問題。以下第乙個語句需要加 s 鎖,其它都需要加 x 鎖。

select

*from

table

where ? lock

inshare

mode

;# 加 s 鎖

select

*from

table

where ? for

update

;insert

;update

;delete

;

對於讀操作,由於 mvcc 的引入,分為快照讀和當前讀:

rc 和 rr 都是基於 mvcc 實現的,但是讀取的快照資料是不相同的:

總是讀取最新的資料行,無需使用 mvcc。

next-key locks 是 mysql 的 innodb 儲存引擎的一種鎖實現;

mvcc 不能解決幻影讀問題,next-key locks 就是為了解決這個問題而存在的;

在可重複讀(repeatable read)隔離級別下,使用 mvcc + next-key locks 可以解決幻讀問題;

鎖定乙個記錄上的索引,而不是記錄本身;

如果表沒有設定索引,innodb 會自動在主鍵上建立隱藏的聚簇索引,因此 record locks 依然可以使用;

鎖定索引之間的間隙,但是不包含索引本身。例如當乙個事務執行以下語句,其它事務就不能在 c 中插入 15。

select c from t where c between

10and

20for

update

;

它是 record locks 和 gap locks 的結合,不僅鎖定乙個記錄上的索引,也鎖定索引之間的間隙,是乙個前開後閉區間。例如乙個索引包含以下值:10, 11, 13, and 20,那麼就需要鎖定以下區間:

(

-∞,10](

10,11]

(11,13

](13,

20](20

,+supremum)

問題一:對主鍵索引或唯一索引會使用間隙鎖嗎?

不一定。視情況而定:

delete

from tb where id =

9-- table: tb(name primary key,id unique key)

-- key 是唯一索引

根據 id=9 條件定位,此時給 id = 9 的索引加上記錄鎖,根據 name 值到主索引中檢索獲得記錄,再給該記錄加上記錄鎖。

問題二:間隙鎖是否用在非唯一索引的當前讀中?

是的。

delete

from tb1 where id =

9-- table: tb1(name primary key,id key)

-- key 是非唯一索引

可以看出,在 (6,9] 、(9,11] 加了間隙鎖。

問題三:間隙鎖是否用在不走索引的當前讀中?

是的。

delete

from tb2 where id =

9-- table: tb2(name primary key,id)

-- 沒有為 id 建立索引

此時對所有的間隙都上鎖(功能上相當於鎖表)。

總結

主鍵索引 / 唯一索引:

非唯一索引:

不走索引:

MySQL事務隔離級別的實現原理

在mysql的眾多儲存引擎中,只有innodb支援事務,所有這裡說的事務隔離級別指的是innodb下的事務隔離級別。讀未提交 乙個事務可以讀取到另乙個事務未提交的修改。這會帶來髒讀 幻讀 不可重複讀問題。基本沒用 讀已提交 乙個事務只能讀取另乙個事務已經提交的修改。其避免了髒讀,但仍然存在不可重複讀...

MySQL事務隔離級別的實現原理

在mysql的眾多儲存引擎中,只有innodb支援事務,所有這裡說的事務隔離級別指的是innodb下的事務隔離級別。讀未提交 乙個事務可以讀取到另乙個事務未提交的修改。這會帶來髒讀 幻讀 不可重複讀問題。基本沒用 讀已提交 乙個事務只能讀取另乙個事務已經提交的修改。其避免了髒讀,但仍然存在不可重複讀...

mysql 事務隔離級別的實現原理

目錄 一 事務的四要素 acid 二 mysql的事務的隔離級別 三 多版本併發控制 multi version concurrency control 3.1 功能 3.2 原理 1.原子性 atomicity all done 或者 all not done 2.一致性 consistency ...