manualによると、IXテーブルのロックはX行のロックと競合します。Mysql innodb locking:Xが保持されているときにIXを許可しないでください。
既存のロックと互換性があるが、既存のロックと競合しない場合は、要求中のトランザクションにロックが付与されます。
上記の表は、IXとXが競合をロックすることを示しています。しかし、これは私が経験するものではありません。私は、次の
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を実行する場合、mysqlコマンドラインツールを使用して、私は取引4604459のいずれかにXロックを保持していること
------------
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;;
注意を取得しますしたがって、別のトランザクションが「テスト」テーブルでIXロックを取ることはできません。しかし、別のmysqlコマンドラインクライアントで
start transaction; delete from test where a=2;
を実行すると、次の出力
------------
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の奇妙な問題に対処するコードが嫌いです。
2番目の注記では、「レコードロック」のすべてのフィールドについて説明していますか?