我正在运行以下MySQL UPDATE语句:

mysql> update customer set account_import_id = 1;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

我没有使用事务,为什么会得到这个错误?我甚至尝试重新启动我的MySQL服务器,它没有帮助。

该表有406,733行。


当前回答

行数并不大……如果account_import_id不是主键,则在它上创建一个索引。

CREATE INDEX idx_customer_account_import_id ON customer (account_import_id);

其他回答

我在使用php时遇到过这种情况 语言构念退出;正在进行交易。那么这个 事务“挂起”,你需要杀死mysql进程(如上所述processlist;)

我有2个Doctrine DBAL连接,其中一个是非事务性的(用于重要日志),它们旨在并行运行,而不是相互依赖。

CodeExecution(
    TransactionConnectionQuery()
    TransactionlessConnectionQuery()
)

我的集成测试被包装到事务中,以便在每次测试后进行数据回滚。

beginTransaction()
CodeExecution(
    TransactionConnectionQuery()
    TransactionlessConnectionQuery() // CONFLICT
)
rollBack()

我的解决方案是在这些测试中禁用包装事务,并以另一种方式重置db数据。

mysql->SHOW PROCESSLIST;
kill xxxx; 

然后杀了睡着的那个。对我来说是2156。

您是否可以更新这个表中的任何其他记录,或者这个表是否被大量使用?我想的是,当它试图获得一个锁,它需要更新这条记录时,设置的超时已经超时。你可以延长时间,这可能会有所帮助。

某些东西阻塞了查询的执行。很可能是另一个查询更新、插入或删除查询中的某个表。你必须找出那是什么:

SHOW PROCESSLIST;

一旦你找到阻塞进程,找到它的id并运行:

KILL {id};

重新运行初始查询。