发布mysql锁外部事务(rails)

sno*_*ard 13 mysql ruby-on-rails

我们最近看到很多错误:

ActiveRecord::TransactionIsolationConflict: Transaction isolation conflict detected: Lock wait timeout exceeded; try restarting transaction
Run Code Online (Sandbox Code Playgroud)

无法弄清楚背后的原因.但是在我们的代码中注意到一件事是试图锁定事务外部的记录:

acc = Account.lock.find acc_id
Run Code Online (Sandbox Code Playgroud)

上面的代码不在任何事务中,仅用于检查同样获得相同锁的另一个事务是否已完成.如果这可能是罪魁祸首的任何想法?

Tat*_*ata 0

innodb_lock_wait_timeout请检查您的 MySQL 服务器上为和进行的配置lock_wait_timeout。您可以通过运行以下命令来完成此操作

show global variables like '%lock_wait_timeout';

使用哪个参数取决于您的 MySQL 版本和表的引擎

从文档中:

# 从 id=1 的帐户中选择 * 进行更新

Account.lock.find(1)

for update意味着 - 获取写入锁。

您的事务可能需要比数据库上配置的时间更多的时间,并且尝试验证原始事务的检查请求已完成 - 随着等待时间耗尽,出现此错误。