mysql - 为什么 MySQL 慢查询日志锁定时间中不包含事务时间

标签 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;

我从问题一开始就得到了慢速查询条目。

最佳答案

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

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

关于mysql - 为什么 MySQL 慢查询日志锁定时间中不包含事务时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15576834/

相关文章:

php - 将sql语句存储在MySQL中然后运行它

php - Laravel LeftJoin where

sql - 如何用if语句编写sql查询

sql - 如何在go lang中测试事务回滚和提交

mysql - 具有 3 个字段的索引是否适用于 2 个字段查询?

MySQL 进程花费异常长的时间

带有自连接问题的 sqlquery

java.sql.SQLException 关闭语句

c# - 只有一个资源和隔离级别可序列化的死锁...?

php - 检查数据库中是否存在用户名的方法