MySQL中鎖的使用

2021-10-09 17:48:57 字數 2741 閱讀 2174

mysql表級鎖:由mysql sql layer層實現。

mysql的表級鎖有兩種:表鎖、元資料鎖(meta data lock,mdl)

mysql

實現的表級鎖定的爭用狀態變數:

- table_locks_immediate:產生表級鎖定的次數; 

- table_locks_waited:出現表級鎖定爭用而發生等待的次數;

表鎖有兩種表現形式:表共享讀鎖(table read lock)、表獨佔寫鎖(table write lock)。

-- 手動增加表鎖:

lock table 表名稱 read(write),表名稱2 read(write),其他;

-- 檢視表鎖情況:

show open tables;

-- 刪除表鎖

unlock tables;

現有兩個表,乙個是tuser表,乙個是tdep表。

(1)讀鎖

1.首先給tdep表加讀鎖

lock table tdep read;
2.查詢tuser表,發現不能訪問非鎖定的表。

lock table tdep read;
3.查詢tdep表,是可以查詢的。

select * from tdep;
4.修改tdep表,修改阻塞,自行加行寫鎖。

update tdep set name='部門' where id=1
5.釋放表鎖。

unlock tables;
6.再次查詢tuser表,這時是可以進行查詢的。

select * from tuser;
(2)寫鎖1.給tdep加寫鎖。

lock table tdep write;
2.查詢tuser表,不能訪問非限定表。

select * from tuser;
3.查詢tdep表,可以查詢。

select * from tdep;
4.對tdep表進行更新操作,是可以執行的。

update tdep set name='部門' where id=2;
5.釋放表鎖。

unlock tables;
6.再次查詢tuser表,是可以查詢的。

select * from tuser;
在mysql5.5版本中加入了mdl,當對乙個表做增刪改查操作的時候,加mdl讀鎖;當要對錶做結構變更操作的時候,加mdl寫鎖。

innodb儲存引擎實現。

innodb的行級鎖,按照鎖定範圍來說,可以分為三種:

記錄鎖(record locks):鎖定索引中一條記錄。

間隙鎖(gap locks):鎖定記錄前、記錄中、記錄後的行rr隔離級(可重複讀)-- mysql預設隔離級別

next-key鎖:記錄鎖 + 間隙鎖。

行級鎖,按照功能來分,可以分為三種:

共享讀鎖(s):允許乙個事務去讀一行,阻止其他事務獲得相同資料集的排他鎖。

排他寫鎖(x): 允許獲得排他寫鎖的事務更新資料,阻止其他事務取得相同資料集的共享讀鎖和排他寫鎖。

1.自動加dml。對於update、delete 和insert 語句,innodb會自動給涉及資料集加排他鎖(x)。

2.手動加。

innodb也實現了表級鎖,也就是意向鎖。意向鎖是mysql內部使用的,不需要使用者干預的。

意向共享鎖(is):事務打算給資料行加行共享鎖,事務在給乙個資料行加共享鎖前必須先取得該錶的is鎖。

意向排他鎖(ix):事務打算給資料行加行排他鎖,事務在給乙個資料行加排他鎖前必須先取得該錶的ix鎖。

意向鎖的主要作用是為了【全表更新資料】時的效能提公升,否則在全表更新資料時,需要先檢索該錶是否某些記錄上面有行鎖。

共享鎖排他鎖

意向共享鎖

意向排他鎖

共享鎖相容

衝突相容

衝突排他鎖

衝突衝突

衝突衝突

意向共享鎖

相容衝突

相容相容

意向排他鎖

衝突衝突

相容相容

innodb行鎖是通過給索引上的索引項加鎖來實現的,因此innodb這種行鎖實現特點就意味著:只有通過索引條件檢索的資料,innodb才使用行級鎖,否則innodb將使用表鎖。

間隙鎖:是乙個在索引記錄之間的間隙上的鎖。

間隙鎖的作用:保證某個間隙內的資料在鎖定情況下不會發生任何變化。

間隙鎖防止兩種情況:1.防止插入間隙內的資料;2.防止已有資料更新為間隙內的資料。

死鎖:兩個session互相等待對方的資源釋放之後,才能釋放自己的資源,造成了死鎖。

Mysql 中互斥鎖的使用

本文介紹如在在多執行緒mysql 開發中使用互斥鎖。mysql自己對c 的mutex又進行了一次封裝,封裝的 可以在include mysql psi mysql thread.h 中找到。下面大概地介紹下如何使用互斥鎖。鎖的生命週期大體為 初始化鎖 上鎖 解鎖 銷毀鎖。注 表示0個或多個。初始化鎖...

mysql中悲觀鎖的使用

一 普通用法 場景舉例 商品goods表中有乙個欄位status,status為1代表商品未被下單,status為2代表商品已經被下單,那麼我們對某個商品下單時必須確保該商品status為1。假設商品的id為1。如果不採用鎖,那麼操作方法如下 1.查詢出商品資訊 select status from...

mysql鎖的使用 MySQL之鎖的使用

mysql表級鎖的鎖模式 mysql的表級鎖有兩種模式 表共享讀鎖 table read lock 和表獨佔寫鎖 table write lock 鎖模式的相容性 對myisam表的讀操作,不會阻塞其他使用者對同一表的讀請求,但會阻塞對同一表的寫請求 對 myisam表的寫操作,則會阻塞其他使用者對...