【发布时间】:2022-01-19 04:44:26
【问题描述】:
我在 MySQL 5.7(在 AWS RDS Aurora 上运行)上有一个表 Contact,如下所示:
CREATE TABLE Contact (
id BIGINT NOT NULL AUTO_INCREMENT,
email VARCHAR(255) NOT NULL UNIQUE,
firstname VARCHAR(255) NOT NULL,
lastname VARCHAR(255) NOT NULL,
createdAt DATETIME,
updatedAt DATETIME
);
该表有 4 个其他表通过 Contact.id 连接到它,但该关系未使用外键强制执行。
生产表包含超过 10M 行。我最近编写了一个 NodeJS 脚本,它获取联系人 ID 列表并在 Contact 表上运行 DELETE 查询。重要的部分如下所示:
await this.query("DELETE FROM AssociatedTableA WHERE contactId=?", contactId);
await this.query("DELETE FROM AssociatedTableB WHERE contactId=?", contactId);
await this.query("DELETE FROM AssociatedTableC WHERE contactId=?", contactId);
await this.query("DELETE FROM AssociatedTableD WHERE contactId=?", contactId);
await this.query("DELETE FROM Contact WHERE contactId=?", contactId);
上述部分针对从包含 250 万行的一系列 CSV 文件解析的每个联系人 ID 运行。多个工作进程解析 CSV 文件并执行 sn-p。 它不是事务的一部分,也没有显式锁
当此脚本运行时,应用程序处于生产状态,用户正在注册联系人。但是,在几次删除之后,INSERTS 被阻止并出现以下错误:
ER_LOCK_WAIT_TIMEOUT: Lock wait timeout exceeded - try restarting transaction
即使停止所有工作进程并重新启动数据库,也无法添加新联系人。我不得不将应用程序置于维护模式并终止与 MySQL 的所有剩余连接。
所以我的问题是,什么类型的锁可能会阻止插入查询? MySQL InnoDB 不应该永远不会锁定整个表吗?
【问题讨论】:
-
你需要提交交易吗?
-
@akaphenom 我没有交易。这就是奇怪的部分
标签: mysql node.js amazon-aurora