如果在where子句中使用非主键,则Mysql选择更新块第一次插入

如果在where子句中使用非主键,则Mysql选择更新块第一次插入,mysql,locking,primary-key,innodb,Mysql,Locking,Primary Key,Innodb,Mysql版本:5.6.33,ubuntu 64位 表模式 通过从每个终端运行1条语句,打开2个会话并引发竞争条件。还提到了报表编号 1号航站楼 2号航站楼 根据,select for update仅锁定它通过的行,就像update一样 问题: 插入查询在接收第一个插入查询的会话中被阻止。 在第二个会话中,在此被阻止的查询之后插入查询可以正常工作。 在上述示例S5块中,S6运行良好 在索引阻止新插入的情况下,是由于间隙锁还是指定的下一个钥匙锁造成的 如果我将id=放入where子句中,那么两个i

Mysql版本:5.6.33,ubuntu 64位

表模式

通过从每个终端运行1条语句,打开2个会话并引发竞争条件。还提到了报表编号

1号航站楼

2号航站楼

根据,select for update仅锁定它通过的行,就像update一样

问题: 插入查询在接收第一个插入查询的会话中被阻止。 在第二个会话中,在此被阻止的查询之后插入查询可以正常工作。 在上述示例S5块中,S6运行良好

在索引阻止新插入的情况下,是由于间隙锁还是指定的下一个钥匙锁造成的

如果我将id=放入where子句中,那么两个insert查询都可以正常运行

1号航站楼

2号航站楼

更新: 如果我将bucket_键作为唯一索引,它可以正常工作。看起来它只适用于唯一键和主键,而不适用于范围

更新:修正了打字错误,在问题的部分select语句中添加了更新

更新:区域_txn的起始值

+----+------------+
| id | bucket_key |
+----+------------+
|  1 | b1         |
|  2 | b2         |
+----+------------+
显示引擎innodb状态

---TRANSACTION 1139415, ACTIVE 11 sec
4 lock struct(s), heap size 1184, 4 row lock(s), undo log entries 1
MySQL thread id 8818, OS thread handle 0x700009268000, query id 1700769 localhost root cleaning up

---TRANSACTION 1139414, ACTIVE 16 sec inserting
mysql tables in use 1, locked 1
LOCK WAIT 5 lock struct(s), heap size 1184, 4 row lock(s), undo log entries 1
MySQL thread id 8626, OS thread handle 0x7000092f0000, query id 1700768 localhost root update
insert into zone_txn(`bucket_key`) values('b1')

------- TRX HAS BEEN WAITING 6 SEC FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 1454 page no 4 n bits 72 index `idx_bucket_key` of table `kyc`.`zone_txn` trx id 1139414 lock_mode X locks gap before rec insert intention waiting
Record lock, heap no 3 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
 0: len 2; hex 6232; asc b2;;
 1: len 8; hex 8000000000000002; asc         ;;

请提供显示引擎INNODB状态;在适当的时候。b1和b2在索引中是否相邻?有间隙锁定吗?@RickJames:我已经粘贴了ShowEngine innodb status的txn部分。请检查。如果我将id=放在where子句中…-我不明白。如果表是以您要插入的行开始的,那么如果插入失败,您真的会运行插入吗?或者您正在显示的事务中缺少一些代码?@RickJames如果我运行id=:从区域_txn中选择*进行更新,其中id=1,类似地,在第二个会话更新的问题中id=2。。。
S2: begin;
S4:     select * from zone_txn FORCE INDEX(idx_bucket_key)
           WHERE `bucket_key` = 'b2' FOR UPDATE;
S6:     insert into zone_txn(`bucket_key`) values('b2');
S8: commit;
S1: begin;
S3:     select * from zone_txn WHERE `id` = 1 FOR UPDATE;
S5:     insert into zone_txn(`bucket_key`) values('b1');
S7: commit;
S2: begin;
S4:     select * from zone_txn WHERE `id` = 2 FOR UPDATE;
S6:     insert into zone_txn(`bucket_key`) values('b2');
S8: commit;
+----+------------+
| id | bucket_key |
+----+------------+
|  1 | b1         |
|  2 | b2         |
+----+------------+
---TRANSACTION 1139415, ACTIVE 11 sec
4 lock struct(s), heap size 1184, 4 row lock(s), undo log entries 1
MySQL thread id 8818, OS thread handle 0x700009268000, query id 1700769 localhost root cleaning up

---TRANSACTION 1139414, ACTIVE 16 sec inserting
mysql tables in use 1, locked 1
LOCK WAIT 5 lock struct(s), heap size 1184, 4 row lock(s), undo log entries 1
MySQL thread id 8626, OS thread handle 0x7000092f0000, query id 1700768 localhost root update
insert into zone_txn(`bucket_key`) values('b1')

------- TRX HAS BEEN WAITING 6 SEC FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 1454 page no 4 n bits 72 index `idx_bucket_key` of table `kyc`.`zone_txn` trx id 1139414 lock_mode X locks gap before rec insert intention waiting
Record lock, heap no 3 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
 0: len 2; hex 6232; asc b2;;
 1: len 8; hex 8000000000000002; asc         ;;