成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試突擊:MVCC 和間隙鎖有什么區別?

開發 前端
在 MVCC 中,每個讀操作會看到一個固定版本的數據庫記錄,即使在并發環境中,也不會出現讀取到了其他事務還未提交的數據的情況。

MVCC 和間隙鎖是兩種完全不同的機制,但它們的目的都是相同的,都是用來保證數據庫并發訪問的,我們先來看二者的定義。

MVCC 定義

MVCC 是多版本并發控制(Multi-Version Concurrency Control)的縮寫,是一種并發控制的方法。

在 MVCC 中,每個讀操作會看到一個固定版本的數據庫記錄,即使在并發環境中,也不會出現讀取到了其他事務還未提交的數據的情況。

MVCC 通過保存數據在某個時間點的快照來實現這一點。在讀取數據時,只會讀取在該時間點之前提交的數據。在寫入數據時,會為每個寫入操作創建一個新版本的數據,而不是直接覆蓋原有的數據。這樣,讀操作就可以讀取舊版本的數據,而寫操作則可以寫入新版本的數據,從而實現了并發控制。

在 MySQL 中,InnoDB 存儲引擎就是使用 MVCC 來實現并發控制的。

間隙鎖定義

間隙鎖是一種鎖定索引范圍而非實際數據的鎖,它可以鎖定一個范圍,防止其他事務在這個范圍內插入數據,從而保證了范圍內的數據的唯一性。在 MySQL 中,InnoDB 存儲引擎支持間隙鎖。當使用 SELECT ... FOR UPDATE 或 SELECT ... LOCK IN SHARE MODE 語句時,InnoDB 存儲引擎會自動使用間隙鎖來鎖定索引范圍。

如果一個事務在一個間隙上持有了鎖,那么其他事務就不能在這個間隙上插入數據,但是可以在這個間隙之前或之后的位置插入數據。

為什么要有 MVCC?

既然已經有鎖可以防止并發訪問了,那為什么還需要 MVCC 呢?MVCC 的誕生主要是出于性能的考慮,因為 MVCC 中沒有用到鎖,它是通過多版本并發控制的手段來實現數據庫并發訪問的,這樣相比于加鎖性能就會好很多。

MVCC 實現原理

MVCC 竟然這么強,那它是怎么實現的呢?簡單來說 MVCC 是通過以下 3 大組件實現的:

  1. 隱藏字段:每個執行的 SQL 命令都有幾個隱藏的字段,其中有一個事務 ID 字段,很重要。
  2. undo log(回滾日志):里面記錄了 SQL 命令執行的歷史數據。
  3. Read View(讀視圖):包含快照讀(一個快照,保存了數據庫某個時刻的數據)和一些重要的屬性。

它的實現原理簡單來說,是通過 SQL 中隱藏的字段事務 ID(自己的版本號)和 Read View 中的屬性版本號進行對比,對比之后決定使用 Read View 中的快照或 undo log 中的歷史數據(對比的規則是 MVCC 機制的規定,本文不展開討論),最后再將符合的數據返回。

MVCC 可以解決幻讀嗎?

幻讀是指在一個事務中,第一次查詢某個范圍的數據時,發現有一些數據符合條件,但是當再次查詢同樣的范圍時,卻發現多了一些或者少了一些數據。這種情況就被稱為幻讀。幻讀是由于并發事務中的數據修改操作導致的,比如在一個事務中,另一個事務插入了一條符合條件的數據,導致第二次查詢時多了一條數據。

MVCC 機制可以解決部分幻讀問題,MVCC 是通過保存數據在某個時間點的快照來實現來解決(部分)幻讀問題的,在讀取數據時,MVCC 會根據快照來確定可見的數據版本。這樣,即使其他事務在讀取數據時進行了修改,也不會影響當前事務的讀取結果。

因此,MVCC 可以有效地解決這部分幻讀問題。但需要注意的是,MVCC 只能解決讀取數據時的幻讀問題,對于寫入數據時的幻讀問題,還需要配合鎖機制或使用更高的事務隔離級別(串行化)來解決。

也就是說,想要徹底解決 MySQL InnoDB 中 RR(REPEATABLE READ,可重復讀)事務隔離級別的幻讀問題,需要使用 MVCC + 鎖機制共同來實現。

鎖分類

在 MySQL InnoDB 中的鎖機制不止有間隙鎖,還有行鎖和臨建鎖等。

行鎖、間隙鎖和臨建鎖有什么區別?

行鎖、間隙鎖和臨建鎖都是 MySQL 中的鎖機制,它們的區別如下:

  • 行鎖是針對某一行數據進行的鎖定,可以防止其他事務修改該行數據。
  • 間隙鎖是針對某一范圍的數據進行的鎖定,可以防止其他事務在該范圍內插入數據。
  • 臨建鎖是行鎖和間隙鎖的組合,可以理解為一種特殊的間隙鎖,它等于行鎖+間隙鎖,除了鎖住記錄本身,還會鎖住索引之間的間隙,即鎖定一段左開右閉的索引區間。

小結

MVCC 和鎖機制解決了 MySQL InnoDB 中 RR 事務隔離級別的幻讀問題,而 MySQL 中的鎖類型又有很多種,如行鎖、間隙鎖、臨建鎖等。

最后

責任編輯:武曉燕 來源: Java中文社群
相關推薦

2022-05-09 07:37:04

Java非公平鎖公平鎖

2022-08-22 07:06:32

MyBatisSQL占位符

2022-08-03 07:04:56

GETHTTPPOST

2022-08-10 07:06:57

IoCDISpring

2022-04-24 07:59:53

synchronizJVMAPI

2022-02-08 07:02:32

進程線程操作系統

2022-08-15 07:06:50

Propertiesyml配置

2022-04-26 08:02:00

locktryLocklockInterr

2022-10-09 20:52:19

事務隔離級別傳播機制

2022-03-16 07:33:40

守護線程用戶線程語言

2022-08-29 07:05:02

JSRJava語言

2022-01-11 06:53:23

面試重寫重載

2022-07-18 07:11:35

請求轉發請求重定數據共享

2023-02-17 08:02:45

@Autowired@Resource

2023-02-01 07:15:16

2023-02-17 08:10:24

2024-04-03 15:33:04

JWTSession傳輸信息

2024-09-19 08:42:43

2022-06-13 07:36:06

MySQLInnoDB索引

2024-09-24 13:49:13

SQL數據庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久国产电影 | 天天久久 | 久久免费视频2 | 欧美二区乱c黑人 | 97免费在线观看视频 | 日本亚洲欧美 | 久久男人 | 亚洲a视频| 国产成人精品一区二区三区视频 | 欧美日韩网站 | 在线日韩中文字幕 | 日韩精品在线一区 | 久久久久午夜 | 亚洲国产精品视频 | 97视频成人 | 欧美一区二区三区在线观看视频 | 精品一区二区三区中文字幕 | www.日本三级| 精精国产xxxx视频在线播放 | 538在线精品| 岛国av一区二区 | 成人性视频在线播放 | 国产精品免费一区二区 | 91看片在线观看 | 午夜精品一区二区三区在线视 | 亚洲国产成人精品女人久久久 | 久久y| 欧美日韩亚洲国产 | 91av视频在线观看 | 久久视频精品 | 国产成人高清在线观看 | 中文字幕国产精品 | 丁香婷婷久久久综合精品国产 | 午夜精品久久久久久久久久久久 | 麻豆天堂| 精品一二区 | 国产精品久久久久久久粉嫩 | 欧美精品电影一区 | 97国产成人 | 国产在线网址 | caoporn视频 |