gpt4 book ai didi

mysql - 在事务外释放 mysql 锁 (rails)

转载 作者:IT老高 更新时间:2023-10-29 00:12:41 26 4
gpt4 key购买 nike

我们最近看到了很多错误:

ActiveRecord::TransactionIsolationConflict: Transaction isolation conflict detected: Lock wait timeout exceeded; try restarting transaction

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

acc = Account.lock.find acc_id

以上代码不在任何事务中,仅用于检查也获得相同锁的另一个事务是否已完成。关于这是否是罪魁祸首有什么想法吗?

最佳答案

InnoDB 在巨大的写入负载时使用行级锁定以获得更好的并发性。引擎采取了一些预防措施来消除幻读,其中之一是 gap_lock,它可能会导致此问题。使用

SHOW ENGINE INNODB STATUS

分析gap_lock。

如果这是问题,您可以尝试以下选项

  1. ISOLATION 级别更改为 READ COMMITTED

  2. 设置 innodb_locks_unsafe_for_binlog = 1。这将禁用间隙锁,除了外键约束检查或重复键检查。

  3. 再次使用show innodb status来分析发生了什么。如果需要优化您的代码以避免锁定

  4. 如果上述方法不起作用,请尝试全局增加 lock_wait_timeout

设置全局 innodb_lock_wait_timeout = 120;

或者一个 session

SET innodb_lock_wait_timeout = 120;
  1. 再次检查您的配置,如果仍然没有更新则重新设置全局变量

    show variables like '%wait_timeout%';

    show variables like '%tx_isolation%';

    SELECT @@GLOBAL.tx_isolation, @@tx_isolation;

关于mysql - 在事务外释放 mysql 锁 (rails),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29500281/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com