为什么事务时间不包含在MySQL慢查询日志锁定时间内

时间:2013-03-22 17:51:16

标签: mysql sql transactions locking

问题

在MySQL慢查询日志中,我发现需要花费大量时间的查询,这是因为多个并发事务正在更新同一行:

# Time: 130322 17:42:07
# User@Host: root[root] @ localhost [127.0.0.1]
# Query_time: 48.500955  Lock_time: 0.000062 Rows_sent: 0  Rows_examined: 1
use test;
SET timestamp=1363974127;
UPDATE test SET count = count + 1 WHERE id = 1;

为什么要等待Lock_time中没有计入的交易,那么计算什么?

重现

以下是重现慢查询条目的方法。创建表:

CREATE TABLE test (
   id INT PRIMARY KEY,
   count INT NOT NULL
);

然后插入一行:

INSERT INTO test VALUES (1,1);

如果我在关闭自动提交的情况下启动与数据库的2个连接,并在第一个运行中启动:

BEGIN;
UPDATE test SET count = count + 1 WHERE id = 1;

然后使用第二个连接运行:

BEGIN;
UPDATE test SET count = count + 1 WHERE id = 1;
COMMIT;

然后等待很短的时间使这个查询变慢,然后返回到第一个连接并执行提交:

COMMIT;

我从问题的开头得到了慢查询条目。

1 个答案:

答案 0 :(得分:1)

事实证明这是MySQL中的一个错误,它没有报告InnoDB下的完整锁定时间,并在MySQL 5.5.6中得到修复:

http://bugs.mysql.com/bug.php?id=53496