【发布时间】:2018-04-16 08:38:18
【问题描述】:
让我从一个 SQL 示例开始我的问题。
这是表格设置:
- 创建表
x和y。y.x指的是x.id。 - 在
x(id=1) 中插入一行。
START TRANSACTION;
CREATE TABLE `x` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`value` INT(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB;
CREATE TABLE `y` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`x_id` INT(11) NOT NULL,
`value` INT(11) NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `fk_x` FOREIGN KEY (`x_id`)
REFERENCES `x` (`id`)
) ENGINE=INNODB;
INSERT INTO x values (1,123456);
COMMIT;
现在开始一个事务 (Trx A) 以更新 x 中的行。
START TRANSACTION;
UPDATE x SET value=value+1 WHERE id = 1;
在提交之前,我正在启动另一个事务 (Trx B) 以向y 插入一行。
START TRANSACTION;
INSERT INTO y VALUES (null,1,123456);
---- HANGED ----
-- Until Trx A is committed or rolled-back, the Trx B is hanged here.
问题是 - 预计 Trx B 会在那时被绞死吗?为什么以及任何解决方法?
这已经在 MySQL 5.7.21、Percona 5.7.21、MariaDB 10.2.14 上进行了测试
【问题讨论】:
标签: mysql foreign-keys innodb rowlocking