天天看點

mysql資料庫鎖簡介

mysql資料庫鎖簡介

樂觀鎖

樂觀鎖最常用的實作方式是用資料版本(Version)記錄機制。資料版本即為資料增加一個版本辨別,一般通過在資料庫表中增加一個數字類型的 “version” 字段實作。讀取資料時将version字段值一同讀出,資料每更新一次,對version值加1,送出更新時将資料庫表對應記錄的目前version值與已取出的version值進行比對,如果資料庫表目前version值與已取出的version值相等,則可以更新,否則認為是過期資料。

通常在實際項目中涉及金錢類的可能會使用這種樂觀鎖。

舉例:

1、資料庫表三個字段,分别是id、value、version

select id,value,version from table1 where id = #{id}

2、每次更新表中的value字段時為了防止發生沖突,需要這樣操作

update table1

set value=2,version=version+1

where id=#{id} and version=#{version}

悲觀鎖

悲觀鎖認為在操作資料時會出現資料沖突,每次都要通過擷取鎖才能對相同資料進行操作,是以悲觀鎖需要耗費較多的時間。共享鎖 和 排它鎖 是悲觀鎖的不同實作,都屬于悲觀鎖的範疇。

1、鎖的粒度

mysql資料庫鎖簡介

InnoDB預設采用行鎖,在未使用索引字段查詢時更新為表鎖。行鎖可能因為未使用索引而更新為表鎖,是以除了檢查索引是否建立的同時,也需要通過explain執行計劃查詢索引是否被實際使用。

2、讀寫鎖

mysql資料庫鎖簡介

3、意向鎖(Intention Locks)

為了實作多粒度鎖機制,協調 行級讀寫鎖 和 表級讀寫鎖 (也就是不同粒度)之間的關系。意向鎖是一種允許 行鎖 與 表鎖 共存的表鎖。意向鎖是由資料庫引擎維護的,使用者無法手動操作。在為資料行加 共享鎖 / 排它鎖 之前,InooDB 會先擷取該資料行所在資料表的對應 意向鎖。意向鎖隻會阻塞全表請求,主要目的是展示正在鎖定表中一行,或者将要鎖定一行。

意向鎖分為兩種:

意向共享鎖(intention shared lock, IS):事務有意向對表中的某些行加共享鎖(S鎖)

-- 事務要擷取某些行的 S 鎖,必須先獲得表的 IS 鎖。

SELECT column FROM table1 ... LOCK IN SHARE MODE;

意向排它鎖(intention exclusive lock, IX):事務有意向對表中的某些行加排它鎖(X鎖)

-- 事務要擷取某些行的 X 鎖,必須先獲得表的 IX 鎖。

SELECT column FROM table1 ... FOR UPDATE;

意向鎖不會與行級的 共享/排它鎖 互斥。

mysql資料庫鎖簡介

1) InnoDB 支援多粒度鎖,特定場景下,行級鎖 可以與 表級鎖 共存。

2) 意向鎖之間互不排斥,但除了 IS 與 S 相容外,意向鎖會與 共享鎖 / 排它鎖 互斥。

3) IX,IS是表級鎖,不會和行級的X,S鎖發生沖突。隻會和表級的X,S發生沖突。

4) 意向鎖在保證并發性的前提下,實作了行鎖和表鎖共存且滿足事務隔離性的要求。

4、記錄鎖(Record Locks)

記錄鎖是在索引記錄上的鎖。例如,SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE; 防止任何其他事務 插入、更新 或 删除 t.c1=10 的行。

5、間隙鎖(Gap Locks)

間隙鎖(gap)是索引記錄之間上的鎖,或者說第一個索引記錄之前或最後一個索引記錄之後的間隔上的鎖。例如,SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20 FOR UPDATE; 阻止其他事務插入 t.c1 = 15 的記錄,不管是否已經有這種值在本列中,因為這個範圍内的所有值都被上鎖了。

6、NK鎖(Next-Key Locks)

NK鎖是記錄鎖和間隙鎖的組合,鎖定一個範圍,并且鎖定記錄本身。對查詢範圍進行加鎖,在另一個事務執行插入操作時是不被運作的,進而避免了幻讀。用于解決幻讀問題。

InnoDB預設的事務隔離級别是Repeatable Read,此時InnoDB使用NK鎖進行搜尋和索引掃描,防止産生幻讀。

7、插入意向鎖(Insert Intention Locks)

插入意向鎖是在插入一條記錄行前,由 INSERT 操作産生的一種間隙鎖。該鎖用以表示插入意向,當多個事務在同一區間(gap)插入位置不同的多條資料時,事務之間不需要互相等待。

插入意向鎖本質上可以看成是一個間隙鎖(Gap Lock)。

普通的Gap Lock 不允許 在(上一條記錄,本記錄)範圍内插入資料

插入意向鎖Gap Lock 允許 在(上一條記錄,本記錄)範圍内插入資料

插入意向鎖的作用是為了提高并發插入的性能, 多個事務 同時寫入 不同資料 至同一索引範圍(區間)内不需要等待其他事務完成,不會發生鎖等待。

InnoDB 在 Repeatable Read 的事務隔離級别下,使用插入意向鎖來控制和解決并發插入。

8、自增鎖(AUTO-INC Locks)

自增鎖是由插入到具有AUTO_INCREMENT列的表中的事務所采用的特殊表級鎖。 在最簡單的情況下,如果一個事務正在向表中插入值,任何其他事務必須等待,以便這個事務獲得連續的主鍵值。

原文位址

https://www.cnblogs.com/aiandbigdata/p/10488308.html