久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長(zhǎng)資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      一文聊聊MySQL中的插入意向鎖(Insert Intention Lock)

      Insert Intention Lock,中文我們也稱之為插入意向鎖。它是間隙鎖的一種,專門針對(duì) insert 操作,官方意思是說(shuō)多個(gè)事務(wù)在同一個(gè)索引同一個(gè)范圍區(qū)間插入記錄時(shí)候,如果插入位置不沖突,不會(huì)彼此阻塞。下面本篇文章就來(lái)帶大家了解一下MySQL中的插入意向鎖,希望對(duì)大家有所幫助!

      一文聊聊MySQL中的插入意向鎖(Insert Intention Lock)

      Insert Intention Lock,中文我們也稱之為插入意向鎖。

      這個(gè)可以算是對(duì)我們之前所講的 Gap Lock 的一個(gè)補(bǔ)充,關(guān)于 Gap Lock,如果還有小伙伴不懂,可以參考:記錄鎖、間隙鎖與 Next-Key Locks。

      1. 為什么需要插入意向鎖

      我們之前已經(jīng)有 Gap Lock 了,Gap Lock 可以幫我們?cè)谝欢ǔ潭壬辖鉀Q幻讀問(wèn)題,但是,之前的似乎有點(diǎn)問(wèn)題。

      假設(shè)我有如下一張表:

      CREATE TABLE `user` (   `id` int(11) unsigned NOT NULL AUTO_INCREMENT,   `username` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,   `age` int(11) NOT NULL,   PRIMARY KEY (`id`),   KEY `age` (`age`) ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
      登錄后復(fù)制

      id 是主鍵自增;age 是一個(gè)普通索引,現(xiàn)在表中有如下數(shù)據(jù):

      一文聊聊MySQL中的插入意向鎖(Insert Intention Lock)

      假設(shè)我想執(zhí)行如下的插入 SQL:

      begin;insert into user(username,age) values('wangwu',95);復(fù)制代碼
      登錄后復(fù)制

      注意,這個(gè) SQL 執(zhí)行了但是事務(wù)還沒(méi)有提交。

      按照我們之前學(xué)習(xí)的關(guān)于 Gap Lock 的知識(shí)分析一下,此時(shí)間隙鎖的范圍是 (89,99),意思是這個(gè)范圍的 age 都不可以插入。

      如果是這樣的話,小伙伴們會(huì)發(fā)現(xiàn)數(shù)據(jù)插入的效率可就太低了,很容易發(fā)生鎖沖突,那么怎么辦?

      我們今天要介紹的插入意向鎖就是用來(lái)解決這個(gè)問(wèn)題的。

      2. 什么是插入意向鎖

      我們來(lái)看看 MySQL 官網(wǎng)的介紹:

      An insert intention lock is a type of gap lock set by INSERT operations prior to row insertion. This lock signals the intent to insert in such a way that multiple transactions inserting into the same index gap need not wait for each other if they are not inserting at the same position within the gap. Suppose that there are index records with values of 4 and 7. Separate transactions that attempt to insert values of 5 and 6, respectively, each lock the gap between 4 and 7 with insert intention locks prior to obtaining the exclusive lock on the inserted row, but do not block each other because the rows are nonconflicting.

      大致翻譯下一下就是這樣:

      插入意向鎖是一種在 INSERT 操作之前設(shè)置的一種間隙鎖,插入意向鎖表示了一種插入意圖,即當(dāng)多個(gè)不同的事務(wù),同時(shí)往同一個(gè)索引的同一個(gè)間隙中插入數(shù)據(jù)的時(shí)候,它們互相之間無(wú)需等待,即不會(huì)阻塞(要是單純按照之前間隙鎖的理論,必須要等一個(gè)間隙鎖釋放了,下一個(gè)事務(wù)才可以往相同的間隙處插入數(shù)據(jù))。假設(shè)有值為 4 和 7 的索引記錄,現(xiàn)在有兩個(gè)事務(wù),分別嘗試插入值為 5 和 6 的記錄,在獲得插入行的排他鎖之前,每個(gè)事務(wù)使用插入意向鎖鎖定 4 和 7 之間的間隙,但是這兩個(gè)事務(wù)不會(huì)相互阻塞,因?yàn)樾惺遣粵_突的。

      這就是插入意向鎖。

      3. 實(shí)踐

      小伙伴們注意,松哥之前和大家聊 Gap Lock,說(shuō)過(guò)這個(gè)是可重復(fù)讀(REPEATABLE READ)這個(gè)隔離級(jí)別下特有的產(chǎn)物,那么現(xiàn)在 Insert Intention Lock 是一種特殊的 Gap Lock,當(dāng)然也是在可重復(fù)讀這個(gè)隔離級(jí)別下生效。

      接下來(lái)我們通過(guò)兩個(gè)個(gè)簡(jiǎn)單的案例來(lái)演示一下插入意向鎖。

      3.1 案例一

      我們的表結(jié)構(gòu)以及數(shù)據(jù)和第一小節(jié)一致。

      首先我們?cè)跁?huì)話 A 中,執(zhí)行如下代碼:

      一文聊聊MySQL中的插入意向鎖(Insert Intention Lock)

      現(xiàn)在會(huì)話 A 中的事務(wù)沒(méi)有提交。

      接下來(lái)我們?cè)跁?huì)話 B 中,也執(zhí)行一個(gè)插入操作:

      一文聊聊MySQL中的插入意向鎖(Insert Intention Lock)

      我們發(fā)現(xiàn)會(huì)話 B 也可以正常執(zhí)行,沒(méi)有發(fā)生阻塞。

      這說(shuō)明,兩個(gè)插入意向鎖之間是兼容的,可以共存的。

      3.2 案例二

      我們?cè)賮?lái)看一個(gè)不兼容的例子。

      首先在會(huì)話 A 中執(zhí)行如下 SQL 查詢 age 大于 80 的記錄,并添加排他鎖:

      一文聊聊MySQL中的插入意向鎖(Insert Intention Lock)

      接下來(lái)在會(huì)話 B 中,執(zhí)行如下代碼插入一行數(shù)據(jù):

      一文聊聊MySQL中的插入意向鎖(Insert Intention Lock)

      小伙伴們看到,這個(gè)操作會(huì)被阻塞!阻塞的原因在于,插入意向鎖和排他鎖之間是互斥的。

      趁著發(fā)生阻塞的這會(huì),在會(huì)話 C 中,我們通過(guò)在前面文章中所使用的 show engine innodb statusG 指令,來(lái)查看下加鎖的情況,重點(diǎn)看 TRANSACTION 節(jié)點(diǎn):

      一文聊聊MySQL中的插入意向鎖(Insert Intention Lock)

      在輸出的內(nèi)容中,紅色框選中的地方,清楚的表明了插入意向鎖的存在。

      4. 小結(jié)

      總結(jié)一下:

      • 插入意向鎖雖然名字中有意向二字,但實(shí)際上是一個(gè)特殊的間隙鎖。

      • 插入意向鎖之間不互斥。

      • 插入意向鎖和排他鎖之間互斥。

      好啦,有問(wèn)題歡迎留言討論。

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)