【问题标题】:Update query is locked更新查询被锁定
【发布时间】:2014-07-24 18:38:57
【问题描述】:

这可能是一个加载的问题,但我们的 MySQL 进程锁定的原因可能是什么?我们遇到了一个问题,我们试图使用我们软件的某个功能,但它“冻结”了。调查该问题后,我们发现对 MySQL 数据库的查询被“锁定”,软件在返回之前等待锁定解锁/解决。

一些背景知识,我们在 Glassfish 上运行 Spring 应用程序并让 GF 进行数据库连接池管理。一切似乎都运行良好,直到我们请求执行一个特定的“更新”功能时开始锁定这些线程。

  • 我们正在更新的表是 innodb 并设置了默认值(我相信行锁定是默认值)
  • 运行show engine innodb status; 未报告任何死锁。
  • 运行show full processlist 会显示一些“锁定”进程。我们没有在代码中明确锁定任何内容。
  • 我们对有问题的表没有外键约束。 ID 是唯一的主键。
  • 从任何地方运行锁定的“更新”查询会导致另一个锁定查询。我们可以毫无问题地从该表中进行选择。我们可以毫无问题地插入其他表。

我能找到的唯一是这里的第一个答案 - MySQL InnoDB hangs on waiting for table-level locks。当人们使用系统时,我们可能已经运行了数据库的转储。这是最可能的原因还是这里可能有其他原因?

【问题讨论】:

    标签: mysql database


    【解决方案1】:

    当然,使用默认选项的 mysqldump 会在转储表之前锁定表,从而导致更新完全被 InnoDB 阻塞。

    在 mysqldump 中使用 --single-transaction 选项来避免该问题。

    见: Run MySQLDump without Locking Tables

    另外,由于是表锁,不是行锁,所以不能用innodb_lock_wait_timeout控制超时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-13
      • 1970-01-01
      • 2012-09-26
      • 2017-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多