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

时间:2017-04-06 10:05:41

标签: mysql locking primary-key innodb

Mysql版本:5.6.33,ubuntu 64位

表架构

CREATE TABLE `zone_txn` (
  `id` bigint(20) NOT NULL,
  `bucket_key` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  INDEX `idx_bucket_key` (`bucket_key`)
)

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

1号航站楼

S1: begin;
S3:     select * from zone_txn FORCE INDEX(idx_bucket_key)
            WHERE `bucket_key` = 'b1' FOR UPDATE;
S5:     insert into zone_txn(`bucket_key`) values('b1');
S7: commit;

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;

根据doc,选择更新"仅锁定已通过的行,就像更新"。

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

是否需要按指定的here进行间隙锁定或下一次锁定,其中新的插入被Index阻止。

如果我把id =<>在where子句中,两个插入查询都运行正常。

1号航站楼

S1: begin;
S3:     select * from zone_txn WHERE `id` = 1 FOR UPDATE;
S5:     insert into zone_txn(`bucket_key`) values('b1');
S7: commit;

2号航站楼

S2: begin;
S4:     select * from zone_txn WHERE `id` = 2 FOR UPDATE;
S6:     insert into zone_txn(`bucket_key`) values('b2');
S8: commit;

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

更新:修正错字,添加"更新"在选择陈述中,这是问题的一部分。

更新:zone_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         ;;

0 个答案:

没有答案