InnoDB鎖例項場景

2021-09-29 04:26:05 字數 2075 閱讀 6174

事務a選取id大於100的行

事務b刪除id大於100的行

可以看到成功了,但是事務a因為mysql的mvcc機制依然可以看到大於100以上的id

insert語句設定的是index-record鎖,不是next-key鎖。也就是不是範圍,允許其他事務在本事務執行期間插入,只要插入的不是同一行就行。

表結構依然是ref 1裡表,表很簡單,只有乙個主鍵。mysql表中預設對主鍵建立聚簇索引(cluster index),聚簇也是唯一索引(unique index),因此是個很好的例子。

事務a:

此時新開乙個終端,開啟乙個事務b。

你可以發現103不可被插入,但是104可以。

這個可以解釋上面文件所說的,insert intention gap lock只會阻止其他事務插入和本事務插入同一行,而如果不是同一行則不會阻止。

死鎖場景實驗

如果插入的是同一行,那麼會不會出現死鎖?會,但是mysql自動解決了。

當多個事務試圖插入同一行,會使得mysql對重複的插入點加入乙個shared lock,此時如果因為第乙個插入的事務退出,會產生乙個死鎖,因為其他的兩個事務無法獲取排它鎖(exclusive lock).

事務a: 試圖插入一行記錄

事務b:試圖插入一行id=999記錄被阻塞,事務c也一樣。(語句都是一樣的)

此時事務a失敗回滾,由於事務b和事務c同時要插入,產生乙個共享鎖。由於共享鎖的存在,每個事務都無法改,因此產生死鎖。

mysql探測到死鎖,不過還是使乙個事務成功:

而乙個事務失敗,被提醒重新開始乙個新事務。

對於官網的另乙個場景也是一樣,乙個成功乙個失敗。因此還是可以的。哈哈哈

刪除會在相關行加exclusive next-key lock

建立乙個表結構,是這樣的,插入兩行資料:

create

table mcol(id int

primary

key,num int);

insert

into mcol(id,num)

values(1

,102),

(2,103

);

事務a先打算刪除num大於100的,

事務b後打算更新num大於100的。

事務b阻塞直至超時。

將上面的順序反過來,事務b先更新,事務a後刪除,事務a會被阻塞直至超時。更新update語句也是exclusive next-key lock 。

innodb鎖機制實驗

事務隔離級別&級別設定

locks set by different sql statements in innodb

Innodb 行鎖與表鎖

行鎖與表鎖 innodb預設是行級別的鎖,當有明確指定的主鍵時候,是行級鎖。否則是表級別。for update的注意點 for update 僅適用於innodb,並且必須開啟事務,在begin與commit之間才生效。要測試for update的鎖表情況,可以利用mysql的command mod...

Innodb 鎖的介紹

innodb 與myisam 的最大不同有兩點 一是支援事務 transaction 二是採用了行級鎖。innodb 中的鎖是跟索引有關的,沒有索引就不給上鎖 recode gap next key locks 1 recode 是鎖住某一行記錄 2 gap lock會鎖住某一段範圍中的記錄 例子 ...

InnoDB間隙鎖簡介

mysql innodb支援三種行鎖定方式 行鎖 record lock 也叫記錄鎖,鎖直接加在索引記錄上面。間隙鎖 gap lock 鎖加在不存在的空閒空間,可以是兩個索引記錄之間,也可能是第乙個索引記錄之前或最後乙個索引之後的空間。next key lock 行鎖與間隙鎖組合起來用就叫做next...