簡體   English   中英

MySQL:INSERT 被外鍵引用行的 UPDATE 阻止

[英]MySQL: INSERT blocked by an UPDATE of the foreign key referenced row

讓我以 SQL 示例開始我的問題。

這是表設置:

  1. 創建表xy yx指的是x.id
  2. 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 上測試過

是的,這是預期的。

Trx A 在記錄上有一個排它鎖 (X),因為它正在更新它。

Trx B 必須在所有外鍵引用上獲取共享模式 (S) 鎖,以確保滿足約束。 它等待 Trx A 釋放它的 X 鎖。

沒有辦法避免這種情況並保持參照完整性。 如果您設法禁用鎖定,MySQL 將無法保證引用的行存在。

通常的解決方法是刪除外鍵。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM