В соответствии с руководством таблица IX блокирует конфликты с блокировками строк X и, следовательно, не может быть предоставлена, когда такая блокировка удерживается. Цитировать
Блокировка предоставляется запрашивающей транзакции, если она совместима с существующими блокировками, но не, если она конфликтует с существующими блокировками.
Таблица выше показывает, что IX и X блокируют конфликты. Тем не менее, это не то, что я испытываю. Используя инструмент командной строки mysql, если я выполню следующее
drop table if exists test; create table test (A int, B int, primary key (A,B), index (A)) TYPE = InnoDB; insert into test values (1,1); start transaction; delete from test where a=1;
и затем запустите SHOW ENGINE INNODB STATUS, я получу
------------
TRANSACTIONS
------------
Trx id counter 0 4604459
Purge done for trx's n:o < 0 4604457 undo n:o < 0 0
History list length 13
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 0 4604434, not started, process no 2015, OS thread id 140642069153536
MySQL thread id 55, query id 1689 localhost esben
---TRANSACTION 0 4604256, not started, process no 2015, OS thread id 140642068752128
MySQL thread id 45, query id 1708 localhost root
SHOW ENGINE INNODB STATUS
---TRANSACTION 0 4604458, ACTIVE 15 sec, process no 2015, OS thread id 140642068952832
2 lock struct(s), heap size 368, 2 row lock(s), undo log entries 1
MySQL thread id 56, query id 1707 localhost esben
TABLE LOCK table "esben_mosegris-esben-trunk"."test" trx id 0 4604458 lock mode IX
RECORD LOCKS space id 7800 page no 3 n bits 72 index "PRIMARY" of table "esben_mosegris-esben-trunk"."test" trx id 0 4604458 lock_mode X
Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0
0: len 8; hex 73757072656d756d; asc supremum;;
Record lock, heap no 2 PHYSICAL RECORD: n_fields 4; compact format; info bits 32
0: len 4; hex 80000001; asc ;; 1: len 4; hex 80000001; asc ;; 2: len 6; hex 00000046422a; asc FB*;; 3: len 7; hex 00000000392350; asc 9#P;;
Обратите внимание, что транзакция 4604459 содержит блокировку X для одной из строк в таблице, и поэтому другая транзакция не может установить блокировку IX для "тестовой" таблицы. Тем не менее, выполнение
start transaction; delete from test where a=2;
в другой командной строке mysql клиент проходит напрямую, выдавая следующий вывод
------------
TRANSACTIONS
------------
Trx id counter 0 4604460
Purge done for trx's n:o < 0 4604457 undo n:o < 0 0
History list length 13
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 0 4604256, not started, process no 2015, OS thread id 140642068752128
MySQL thread id 45, query id 1712 localhost root
SHOW ENGINE INNODB STATUS
---TRANSACTION 0 4604459, ACTIVE 18 sec, process no 2015, OS thread id 140642069153536
2 lock struct(s), heap size 368, 1 row lock(s)
MySQL thread id 55, query id 1710 localhost esben
TABLE LOCK table "esben_mosegris-esben-trunk"."test" trx id 0 4604459 lock mode IX
RECORD LOCKS space id 7800 page no 3 n bits 72 index "PRIMARY" of table "esben_mosegris-esben-trunk"."test" trx id 0 4604459 lock_mode X
Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0
0: len 8; hex 73757072656d756d; asc supremum;;
---TRANSACTION 0 4604458, ACTIVE 55 sec, process no 2015, OS thread id 140642068952832
2 lock struct(s), heap size 368, 2 row lock(s), undo log entries 1
MySQL thread id 56, query id 1707 localhost esben
TABLE LOCK table "esben_mosegris-esben-trunk"."test" trx id 0 4604458 lock mode IX
RECORD LOCKS space id 7800 page no 3 n bits 72 index "PRIMARY" of table "esben_mosegris-esben-trunk"."test" trx id 0 4604458 lock_mode X
Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0
0: len 8; hex 73757072656d756d; asc supremum;;
Record lock, heap no 2 PHYSICAL RECORD: n_fields 4; compact format; info bits 32
0: len 4; hex 80000001; asc ;; 1: len 4; hex 80000001; asc ;; 2: len 6; hex 00000046422a; asc FB*;; 3: len 7; hex 00000000392350; asc 9#P;;
Чего мне не хватает? Моя проблема с этим состоит в том, что, поскольку этот бит проходит, я захожу в тупик немного дальше, так как обе транзакции теперь содержат блокировку IX. Или, возможно, потому что оба пытаются захватить одну и ту же блокировку диапазона. Я мог бы обойти это, но я ненавижу код, который определенно обращается к странностям mysql, особенно когда я не могу это объяснить.
На второй ноте, есть ли где-нибудь объяснение всех этих полей в "Блокировке записи"?