mysql x ix_mysql – 为什么IX-lock与InnoDB中的另一个IX-lock兼容?
https://dev.mysql.com/doc/refman/5.6/en/innodb-lock-modes.html說:
Thus, intention locks do not block anything except full table requests (for example, LOCK TABLES … WRITE). The main purpose of IX and IS locks is to show that someone is locking a row, or going to lock a row in the table.
這意味著多個線程可以獲取IX鎖.這些鎖位于表級,而不是行級. IX鎖意味著持有它的線程打算更新表中某處的某些行. IX鎖僅用于阻止全表操作.
如果你認為它是雙向的,它可能會有所幫助 – 如果正在進行全表操作,那么該線程有一個阻止IX鎖的表級鎖.
DML操作必須先獲取IX鎖,然后才能嘗試行級鎖.原因是您不希望在ALTER TABLE正在進行時允許DML,或者其他一些線程已經(jīng)完成LOCK TABLES … WRITE.
IX鎖定不會阻止UPDATE,DELETE,SELECT..FOR UPDATE等行級更改.它們被其他行級更改或?qū)嶋H的完整表鎖(LOCK TABLES或某些DDL語句)阻止.但是除了那些表操作之外,運行DML的多個線程可能同時工作,只要它們每個都處理一組不重疊的行.
你的評論:
第二個SELECT … FOR UPDATE沒有被阻塞等待IX鎖,它被阻塞等待已經(jīng)被另一個線程中的X鎖鎖定的行上的X(行級)鎖.
我剛嘗試了這個,然后我運行了SHOW ENGINE INNODB狀態(tài),這樣我就可以看到被阻止的事務:
---TRANSACTION 71568, ACTIVE 12 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), heap size 1136, 1 row lock(s)
MySQL thread id 10, OS thread handle 140168480220928, query id 288 localhost root statistics
select * from test where id=1 for update
------- TRX HAS BEEN WAITING 12 SEC FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 802 page no 3 n bits 72 index `PRIMARY` of table `test`.`test`
trx id 71568 lock_mode X locks rec but not gap waiting
看到?它說它正在等待在表測試的主鍵索引上使用lock_mode X授予鎖定.這是一個行級鎖定.
關(guān)于LOCK IN SHARE MODE的困惑:
你在談論SELECT的三個層次.
> SELECT請求沒有鎖.沒有鎖阻止它,它不會阻止其他鎖.
> SELECT … LOCK IN SHARE MODE請求表上的IS鎖定,然后S鎖定與索引掃描匹配的行.多個線程可以在表上保存IS鎖或IX鎖.多個線程可以同時保存S鎖.
> SELECT … FOR UPDATE請求表上的IX鎖,然后X鎖定與索引掃描匹配的行. X鎖是獨占的,這意味著它們不能讓任何其他線程在同一行上具有X鎖或S鎖.
但X和S鎖都不關(guān)心IX或IS鎖.
想想這個比喻:想象一下博物館.
許多人,包括訪客和策展人,都進入了博物館.參觀者想要觀看繪畫,因此他們佩戴標有“IS”的徽章.策展人可能會更換油畫,因此他們會佩戴一張標有“IX”的徽章.博物館里可以同時有很多人,有兩種類型的徽章.它們不會相互阻擋.
在他們的訪問期間,嚴肅的藝術(shù)愛好者將盡可能地接近繪畫,并研究它很長一段時間.在同一幅畫之前,他們很高興讓其他藝術(shù)愛好者站在他們旁邊.因此他們正在做SELECT … LOCK IN SHARE MODE并且他們有“S”鎖,因為他們至少不希望在他們研究它時更換它.
策展人可以取代一幅畫,但他們對嚴肅的藝術(shù)愛好者很有禮貌,他們會等到這些觀眾完成并繼續(xù)前進.所以他們試圖做SELECT … FOR UPDATE(或者只是UPDATE或DELETE).他們此時會獲得“X”鎖,掛上一點點注意“展品被重新設(shè)計”.嚴肅的藝術(shù)愛好者希望以適當?shù)姆绞匠尸F(xiàn)藝術(shù),具有良好的燈光和一些描述性的匾額.他們會等待重新設(shè)計在他們接近之前完成(如果他們嘗試,他們會等待鎖定).
此外,你可能已經(jīng)進入了一個博物館,那里有更多的休閑游客,試圖遠離其他人的方式.他們看著房間中間的畫作,而不是接近太近.他們可以看到其他觀眾正在看的同樣的畫作,他們可以偷看嚴肅藝術(shù)愛好者的肩膀,看看那些被觀看的畫作.當他們更換畫作時,他們甚至可能會對策展人嗤之以鼻(如果他們瞥見一幅尚未正確安裝和點亮的畫作,他們也不在乎).因此,這些隨意的訪客不會阻止任何人,也沒有人阻止他們的觀看.他們只是做SELECT而他們不要求任何鎖.
但也有建筑工人應該拆除墻壁和東西,但他們不會工作,而建筑物中有任何人.他們會等待每個人離開,一旦他們開始工作,他們就不會讓任何人進入.這就是IS和IX徽章的存在阻止DDL(建筑工作),反之亦然.
總結(jié)
以上是生活随笔為你收集整理的mysql x ix_mysql – 为什么IX-lock与InnoDB中的另一个IX-lock兼容?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu18.04设置双显示器-HD
- 下一篇: cocos ClippingNode 之