日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

隔离级别(未提交读、提交读、可重复读、可串行化)、多版本并发控制、Next-Key Locks(Record Locks、Gap Locks)

發布時間:2024/10/14 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 隔离级别(未提交读、提交读、可重复读、可串行化)、多版本并发控制、Next-Key Locks(Record Locks、Gap Locks) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 隔離級別

1.1 未提交讀(READ UNCOMMITTED)

事務中的修改,即使沒有提交,對其它事務也是可見的。

1.2 提交讀(READ COMMITTED)

一個事務只能讀取已經提交的事務所做的修改。換句話說,一個事務所做的修改在提交之前對其它事務是不可見的。

1.3 可重復讀(REPEATABLE READ)

保證在同一個事務中多次讀取同樣數據的結果是一樣的。

1.4 可串行化(SERIALIZABLE)

強制事務串行執行。

隔離級別臟讀不可重復讀幻影讀未提交讀提交讀可重復讀可串行化
×
××
×××


2.?多版本并發控制

多版本并發控制(Multi-Version Concurrency Control, MVCC) 是 MySQL 的InnoDB 存儲引擎實現隔離級別的一種具體方式,用于實現提交讀和可重復讀這兩種隔離級別。

而未提交讀隔離級別總是讀取最新的數據行,無需使用 MVCC。

可串行化隔離級別需要對所有讀取的行都加鎖,單純使用 MVCC 無法實現。

2.1?版本號

系統版本號:是一個遞增的數字,每開始一個新的事務,系統版本號就會自動遞增。

事務版本號:事務開始時的系統版本號。

2.2 隱藏的列

MVCC 在每行記錄后面都保存著兩個隱藏的列,用來存儲兩個版本號:

  • 創建版本號:指示創建一個數據行的快照時的系統版本號;
  • 刪除版本號:如果該快照的刪除版本號大于當前事務版本號表示該快照有效,否則表示該快照已經被刪除了。

2.3 Undo 日志

MVCC 使用到的快照存儲在 Undo 日志中,該日志通過回滾指針把一個數據行(Record) 的所有快照連接起來。

2.4?實現過程

以下實現過程針對可重復讀隔離級別。

當開始新一個事務時,該事務的版本號肯定會大于當前所有數據行快照的創建版本號,理解這一點很關鍵。

2.4.1 SELECT

多個事務必須讀取到同一個數據行的快照,并且這個快照是距離現在最近的一個有效快照。

但是也有例外,如果有一個事務正在修改該數據行,那么它可以讀取事務本身所做的修改,而不用和其它事務的讀取結果一致。

把沒有對一個數據行做修改的事務稱為 T,T 所要讀取的數據行快照的創建版本號必須小于 T 的版本號,因為如果大于或者等于 T 的版本號,那么表示該數據行快照是其它事務的最新修改,因此不能去讀取它。

除此之外,T 所要讀取的數據行快照的刪除版本號必須大于 T 的版本號,因為如果小于等于 T 的版本號,那么表示該數據行快照是已經被刪除的,不應該去讀取它。

2.4.2 INSERT

將當前系統版本號作為數據行快照的創建版本號。

2.4.3 DELETE

將當前系統版本號作為數據行快照的刪除版本號。

2.4.4 UPDATE

將當前系統版本號作為更新前的數據行快照的刪除版本號,并將當前系統版本號作為更新后的數據行快照的創建版本號??梢岳斫鉃橄葓绦?DELETE 后執行INSERT。

2.5 快照讀與當前讀

2.5.1 快照讀

使用 MVCC 讀取的是快照中的數據,這樣可以減少加鎖所帶來的開銷。

select * from table ...;

2.5.2 當前讀

讀取的是最新的數據,需要加鎖。以下第一個語句需要加 S 鎖,其它都需要加 X鎖。

select * from table where ? lock in share mode; select * from table where ? for update; insert; update; delete;

3. Next-Key Locks

Next-Key Locks 是 MySQL 的 InnoDB 存儲引擎的一種鎖實現。

MVCC 不能解決幻讀的問題,Next-Key Locks 就是為了解決這個問題而存在的。

在可重復讀(REPEATABLE READ) 隔離級別下,使用 MVCC + Next-Key Locks可以解決幻讀問題。

3.1 Record Locks

鎖定一個記錄上的索引,而不是記錄本身。

如果表沒有設置索引,InnoDB 會自動在主鍵上創建隱藏的聚簇索引,因此 Record Locks 依然可以使用。

3.2 Gap Locks

鎖定索引之間的間隙,但是不包含索引本身。

例如當一個事務執行以下語句,其它事務就不能在 t.c 中插入 15。

SELECT c FROM t WHERE c BETWEEN 10 and 20 FOR UPDATE;

3.3 Next-Key Locks

它是 Record Locks 和 Gap Locks 的結合,不僅鎖定一個記錄上的索引,也鎖定索引之間的間隙。

例如一個索引包含以下值:10, 11, 13, and 20,那么就需要鎖定以下區間:

(negative infinity, 10] (10, 11] (11, 13] (13, 20] (20, positive infinity)

?

總結

以上是生活随笔為你收集整理的隔离级别(未提交读、提交读、可重复读、可串行化)、多版本并发控制、Next-Key Locks(Record Locks、Gap Locks)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。