1. 程式人生 > >Innodb間隙鎖,細節講解

Innodb間隙鎖,細節講解

關於innodb間隙鎖,網上有很多資料,在此不做贅述,我們講解一下關於innodb的間隙鎖什麼情況下會產生的問題。

網上有些資料說innodb的間隙鎖是為了防止幻讀,這個論點真的是誤人子弟。瞭解innodb機制的朋友就會知道,innodb實現可重複讀和防止幻讀,用的是讀取快照的方式。間隙鎖的目的只是為了事務中的防止刪除或修改不該被刪除或修改的資料而已,因此在innodb中insert語句是沒有間隙鎖的,只有在update和delete語句中才存在間隙鎖。

我們建立一個表做下測試,表結構如下,有個主鍵,有個普通索引:

表中資料如下:

先用客戶端1執行操作:

mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)

mysql> update liuzhe_test set citycode=98 where no = 9;
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2  Changed: 2  Warnings: 0

然後用客戶端2執行操作:
mysql> insert into liuzhe_test values(8,7,'45');

此時資料沒有執行在等待中,說明update的時候間隙鎖起了作用。

然後我們再用delete語句看下:

現在客戶端一執行操作:

mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)

mysql> delete from liuzhe_test where no = 9;
Query OK, 2 rows affected (0.00 sec)

再用客戶端2執行操作:

mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into liuzhe_test values (23,13,'897');

發現還是通過間隙鎖阻塞住了。

使用insert語句是不會產生間隙鎖的。

這足以說明間隙鎖的作用是防止,在update或者delete的時候修改了後面插入的資料。

相關推薦

Innodb間隙細節講解

關於innodb間隙鎖,網上有很多資料,在此不做贅述,我們講解一下關於innodb的間隙鎖什麼情況下會產生的問題。 網上有些資料說innodb的間隙鎖是為了防止幻讀,這個論點真的是誤人子弟。瞭解innodb機制的朋友就會知道,innodb實現可重複讀和防止幻讀,用的是讀取快

Mysql加過程詳解(9)-innodb下的記錄間隙next-key

ans 唯一索引 crazy cimage -h insert tran 存在 gin Mysql加鎖過程詳解(1)-基本知識 Mysql加鎖過程詳解(2)-關於mysql 幻讀理解 Mysql加鎖過程詳解(3)-關於mysql 幻讀理解 Mysql加鎖過程詳解(4)-

MYSQL InnoDB下的記錄間隙next-key

innodb下的記錄鎖(也叫行鎖),間隙鎖,next-key鎖統統屬於排他鎖。 行鎖 記錄鎖其實很好理解,對錶中的記錄加鎖,叫做記錄鎖,簡稱行鎖。 生活中的間隙鎖 程式設計的思想源於生活,生活中的例子能幫助我們更好的理解一些程式設計中的思想。 生活中排隊的場景,小明,小紅,小花三個人

推薦:mysql innodb下的記錄間隙next-key

你需要知道的 之前我們介紹了排他鎖,其實innodb下的記錄鎖(也叫行鎖),間隙鎖,next-key鎖統統屬於排他鎖。 行鎖 記錄鎖其實很好理解,對錶中的記錄加鎖,叫做記錄鎖,簡稱行鎖。 生活中的間隙鎖 程式設計的思想源於生活,生活中的例子能幫助我們更好的理解一些程式

從一個業務看待 InnoDB事務InnoDB資料庫同步的關係

起因 寫這篇文章的起因在於現在公司的一個”啟用學習卡“業務,啟用的介面是其它組提供(你只需要給介面”卡號“和”啟用的人“),而分配哪張卡號是自己來寫,關鍵是這個卡號是從一個表裡每次去選一個。用sql語句每次limit 1 去撈取一條,但是這裡面就出現了資源佔用問題,sql語句每次li

Mysql innodb 間隙

前段時間系統老是出現insert死鎖,很是糾結。經過排查發現是間隙鎖!間隙鎖是innodb中行鎖的一種, 但是這種鎖鎖住的卻不止一行資料,他鎖住的是多行,是一個數據範圍。間隙鎖的主要作用是為了防止出現幻讀,但是它會把鎖定範圍擴大,有時候也會給我們帶來麻煩,我們就遇到了。 在

GAP間隙對唯一鍵普通索引產生的不同影響)

-- (1)先建表,用於證明普通索引,有無間隙鎖-- 建立間隙表,name用的普通索引drop table if exists  test_gap;create table test_gap(id int primary key auto_increment comment

【轉】【MySQL】MySQL中的(表、行共享排它間隙

https://blog.csdn.net/soonfly/article/details/70238902 本文參考:  http://mysqlpub.com/thread-5383-1-1.html  http://blog.csdn.net/c466254931/ar

1-2 【包子mysql系列】 對mysql的innoDB分析

innoDB的事務,是基於鎖來實現的,用到事務不自然就會用到鎖,而如果對鎖理解的不通透,很容易造成線上問題。 資料庫加鎖的分析,和事務的引擎,隔離級別,索引,主鍵索引都有關係, 如果去考慮引擎和各種隔離級別的話,就會很複雜了,所以下面都是基於innoDB和RR的隔離級別進行分析:   表結構

【 58沈劍 架構師之路】InnoDB七種——記錄間隙、臨鍵

MySQL的InnoDB的細粒度行鎖,是它最吸引人的特性之一。   但是,如《InnoDB,5項最佳實踐》所述,如果查詢沒有命中索引,也將退化為表鎖。   InnoDB的細粒度鎖,是實現在索引記錄上的。   一,InnoDB的索引 InnoDB的索引有兩類索引,聚集

InnoDB併發插入居然使用意向

本文取自微信公眾號——《架構師之路》 今天,將要介紹InnoDB另外三種:共享/排他鎖,意向鎖,插入意向鎖。 一,共享/排它鎖(Shared and Exclusive Locks) 《InnoDB併發為何這麼高?》一文介紹了通用的共享/排它鎖,在InnoDB裡

mysql/innoDB樂觀悲觀共享排他概念的理解

MySQL是一個支援外掛式儲存引擎的資料庫系統。本文下面的所有介紹,都是基於InnoDB儲存引擎,其他引擎的表現,會有較大的區別。 儲存引擎檢視 MySQL給開發者提供了查詢儲存引擎的功能,我這裡使用的是MySQL5.5.28,可以使用: show engine

mysql 並行寫資料導致重複的問題間隙解決

   前期設計只會有一個客戶端,現在變為多個客戶端接收同樣的資料,向本地伺服器寫同樣的資料,採用的是mysql的預設事務級別,頻繁導致資料重複。     先是加個行鎖 ,兩個客戶端都執行這段程式碼時,第一個會鎖住;後面的只能等待,類似lock概念;但是未解決資料重複的

Mysql-innoDB存儲引擎(事物MVCC)

緩沖區 zab ODB 做的 bool del 外鍵 安全 撤銷 innoDB的特性:   從圖中由上至下紅色框中的信息是:基於主鍵的聚集索引 ,數據緩存,外鍵支持(邏輯上建立外鍵),行級別鎖,MVCC多版本控制,事務支持。這些也是InnoDB最重要的特性。 事務:  

事務的隔離級別細節以及兩者之間的關係。 同時也說明了 索引 與 之間的關係以及死成因的簡化的情況

背景 MySQL/InnoDB的加鎖分析,一直是一個比較困難的話題。我在工作過程中,經常會有同事諮詢這方面的問題。同時,微博上也經常會收到MySQL鎖相關的私信,讓我幫助解決一些死鎖的問題。本文,準備就MySQL/InnoDB的加鎖問題,展開較為深入的分析與討論,

innodb講解

自己的 技術分享 tex 多維 釋放 http warnings 般的 讀取行 innodb的鎖,我們可以從幾個維度來分析,分為級別,類型 級別 行級鎖 表級鎖 類型 共享鎖(S),也稱為寫鎖, 級別:行級鎖 意向共享鎖(IS),也稱為意向寫鎖 級別:表級鎖 排他

面經手冊 · 第16篇《碼農會ReentrantLock之公平講解和實現》

![](https://img-blog.csdnimg.cn/2020110509221469.png) 作者:小傅哥 部落格:[https://bugstack.cn](https://bugstack.cn) 專題:[面經手冊](https://bugstack.cn/itstack/interview

11.python並發入門(part11 進程同步以及進程池以及callback的概念)

python lock 進程鎖 回調函數 callback 進程池 一、關於進程鎖。其實關於進程鎖沒啥好講的了,作用跟線程的互斥鎖(又叫全局鎖也叫同步鎖)作用幾乎是一樣的。都是用來給公共資源上鎖,進行數據保護的。當一個進程想去操作一個公共資源,它就可以給公共資源進程“上鎖”的操作,其他

information_schema系列八(事物)

開啟 mysql 獲取 排它 lin tin 查詢 pre join 這個系列的文章主要是為了能夠讓自己了解MySQL5.7的一些系統表,統一做一下備註和使用,也希望分享出來讓大家能夠有一點點的受益。 第八篇主要看一下一下幾系統表: 今天我們主要看一下MySQL inf