【问题标题】:Transaction waits forever for InnoDB Lock事务永远等待 InnoDB Lock
【发布时间】:2015-02-25 14:35:27
【问题描述】:

我正在使用 innoDB 块,我正在尝试模拟我在生产服务器中遇到的问题。尝试在 MYSQL 的“事务”表中插入一行时。

我使用这个命令锁定了表:

LOCK TABLES transaction AS tran WRITE;

之后,我从我的 Web 应用程序创建了一个事务,并且该事务被锁阻止。问题是这个交易被永远阻塞了。

我可以通过运行这个命令在 MYSQL 中看到它:

show full processlist;

然后就呆在那里。

我将 MYSQL 变量 innodb_lock_wait_timeout 更改为 10 秒,但从未失败。

这是进程列表中的响应:

Waiting for table metadata lock

提前致谢!

【问题讨论】:

  • 你不应该锁定整个表:当然事务将被永远锁定。相反,您应该创建一个将锁定您将运行的第二个事务的第一个事务。以dev.mysql.com/doc/refman/5.0/en/… 为例

标签: mysql timeout locking innodb


【解决方案1】:

之后,我尝试从我的网络应用创建交易,然后 事务被锁保持阻塞。问题是这 交易被永久阻止。

请出示您的密码:锁定并插入

LOCK TABLES and UNLOCK TABLES Syntax

LOCK TABLES 显式获取当前客户端的表锁 会议。可以为基表或(从 MySQL 5.0.6) 意见。您必须具有 LOCK TABLES 权限,并且 SELECT 每个要锁定的对象的权限。显式解锁表 释放当前会话持有的所有表锁。锁定表 隐式释放当前会话之前持有的任何表锁 获取新锁。

UNLOCK TABLES 的另一个用途是释放全局读锁 使用 FLUSH TABLES WITH READ LOCK 语句获取,这使得 您可以锁定所有数据库中的所有表。

表锁只能防止不适当的读取或写入 其他会议。持有锁的会话,即使是读锁,也可以 执行表级操作,例如 DROP TABLE。截断操作 不是事务安全的,因此如果会话尝试会发生错误 一个在活动事务期间或在持有表锁时。

你看到Configurable InnoDB Auto-Increment Locking了吗 innodb_autoinc_lock_mode ?

mysql> UNLOCK TABLES;
        Query OK, 0 rows affected (0.00 sec)

mysql> DELETE  FROM `shop`;
Query OK, 1 row affected (0.00 sec)

mysql> LOCK TABLES shop AS tran WRITE READ;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO shop AS tran VALUES (1,'A',3.45);
        ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AS tran VALUES (1,'A',3.45)' at line 1
Imysql> INSERT INTO tran VALUES (1,'A',3.45);
        ERROR 1100 (HY000): Table 'tran' was not locked with LOCK TABLES
mysql> INSERT INTO shop  VALUES (1,'A',3.45);
        ERROR 1100 (HY000): Table 'shop' was not locked with LOCK TABLES
mysql>
mysql> UNLOCK TABLES;
Query OK, 0 rows affected (0.00 sec)
D
mysql> DELETE  FROM `shop`;
Query OK, 0 rows affected (0.00 sec)

【讨论】:

  • 插入代码并不重要,因为它正在做它应该做的事情,尝试插入。我真正想知道的是为什么这个插件会永远保存在那里。它应该通过 lock_timeout 返回失败不是吗?我相信这更像是一个 MYSql 问题。
  • 我添加了与 LOCK TABLES 事务 AS tran WRITE 有问题的执行;
  • 添加执行是什么意思?
  • 我添加了示例,您的语法不起作用。请添加纯 SQL 或代码。
猜你喜欢
  • 1970-01-01
  • 2013-11-24
  • 2012-02-24
  • 1970-01-01
  • 2015-02-02
  • 2019-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多