Innodb儲存引擎的鎖機制(一)

2021-09-27 04:09:54 字數 2789 閱讀 7437

隔離級別到底如何實現的呢? --》 鎖、mvcc

鎖是用於管理不同事務對共享資源的併發訪問

表鎖與行鎖的區別:

鎖定粒度:表鎖 > 行鎖

加鎖效率:表鎖 > 行鎖

衝突概率:表鎖 > 行鎖

併發效能:表鎖 < 行鎖

innodb儲存引擎支援行鎖和表鎖(另類的行鎖)

行鎖的演算法

users表的id和idcode和name列是索引列,其他欄位未加索引

共享鎖:

又稱為讀鎖,簡稱s鎖,顧名思義,共享鎖就是多個事務對於同一資料可以共享一把鎖, 都能訪問到資料,但是只能讀不能修改; 加鎖釋鎖方式:

原理:乙個事務獲取了乙個資料行的共享鎖,其他事務能獲得該行對應的共享鎖,但不能獲得排他鎖,即乙個事務在讀取乙個資料行的時候,其他事務也可以讀,但不能對該資料行進行增刪改(因為增刪改都是自動加排它鎖,而排他鎖是不能與其他鎖共存的)。

-- 共享鎖加鎖

begin

select * from users where id=1 lock in share mode; --a :id是索引列,可以給改行加鎖

select * from users where phonenum='13666666666' lock in share mode; --b:phonenum不是索引列, 加鎖無效

rollback;

commit;

-- 其他事務執行

select * from users where id =1 (lock in share mode); --a和b執行後未提交事務 該查詢都可以獲取資料

update users set age=19 where id =1; -- a不可以,因為update會自動加排他鎖,不能與共享鎖共存, b:可以,以為b 沒有加鎖(失效)

排他鎖: 又稱為寫鎖,簡稱x鎖,排他鎖不能與其他鎖並存,如乙個事務獲取了乙個資料行的排他 鎖,其他事務就不能再獲取該行的鎖(共享鎖、排他鎖),只有該獲取了排他鎖的事務是可以對 資料行進行讀取和修改,(其他事務要讀取資料可來自於快照) 加鎖釋鎖方式:

注意:delete / update / insert 預設加上x鎖 select * from table_name where … for update

set session autocommit = off;

update users set age = 23 where id =1;

select * from users where id =1;

update users set age = 26 where id =1; --會給該行加鎖,因為id是索引列(此時排他鎖是行鎖)

update users set age = 26 where phonenum = '13666666666'; -- 會給整個表加鎖,因為phonenum不是索引列(此時排他鎖是表鎖)

commit;

rollback;

-- 手動獲取排它鎖

set session autocommit = on;

begin

select * from users where id =1 for update;

commit;

-- 其他事務執行

select * from users where id =1 lock in share mode; --查詢不了,

select * from users where id =1 for update; --查詢不了

select * from users where id =1; --能查詢,因為這個查詢沒有加鎖,可以從快照中讀取。

innodb行鎖到底鎖了什麼?

innodb的行鎖是通過給索引上的索引項加鎖來實現的。

只有通過索引條件進行資料檢索,innodb才使用行級鎖,否則,innodb 將使用表鎖(鎖住索引的所有記錄)

表鎖:lock tables xx read/write;

意向共享鎖(is):

表示事務準備給資料行加入共享鎖,即乙個資料行加共享鎖前必須先取得該錶的is鎖, 意向共享鎖之間是可以相互相容的

意向排它鎖(ix):

表示事務準備給資料行加入排他鎖,即乙個資料行加排他鎖前必須先取得該錶的ix鎖, 意向排它鎖之間是可以相互相容的

----- 意向鎖的意義

set session autocommit = off;

update users set lastupdate=now() where id = 1; --給表加意向排他鎖

rollback;

-- 其他會話執行

update users set lastupdate=now() where phonenum = '13777777777'; --不能執行,因為phonenum不是索引列,會給整張表加鎖,碰到意向排他鎖會阻塞

update users set lastupdate=now() where id = '2'; --能執行,因為只會對該行加行級別的排他鎖

自增鎖(auto-inc lock)

針對自增列自增長的乙個特殊的表級別鎖 show variables like 『innodb_autoinc_lock_mode』; 預設取值1,代表連續,事務未提交id永久丟失

MySql儲存引擎InnoDB的鎖

innodb實現了以下兩種型別的行鎖 共享鎖 s 允許乙個事務去讀一行,阻止其他事務獲得相同的資料集的排他鎖。排他鎖 x 允許獲得排他鎖的事務更新資料,阻止其他事務獲得相同資料集的共享鎖和排他鎖。共享鎖就是我讀的時候,你可以讀,但是不能寫。排他鎖就是我寫的時候,你不能讀也不能寫。另外,為了允許行鎖和...

InnoDB儲存引擎 鎖引發的問題

我們知道通過鎖機制可以使得對共享資源進行併發訪問時,能夠提供資料的完整性和一致性。實現事務的隔離性要求,可以使得事務可以併發工作。但是鎖提高了併發的提示,也引發了一些問題。主要有以下三種 髒讀 在不同的事務下,當前事務可以讀到另外事務未提交的資料,即可以讀到髒資料 不可重複讀 在乙個事務內,兩次讀到...

MySQL鎖之 InnoDB儲存引擎及其鎖機制

首先要解決的乙個誤區就是 innodb儲存引擎是基於事務的。而前面博文所講的myisam儲存引擎是不支援事務的。那麼什麼是基於事務的呢?複製過來一段我覺得講得還不錯的話 在預設的情況下,mysql 從自動提交 autocommit 模式執行,這種模式會在每條語句執行完畢後把它作出的修改立刻提交給資料...