【问题标题】:Why do I need to rollback a SELECT in mysql (InnoDB)?为什么我需要在 mysql (InnoDB) 中回滚 SELECT?
【发布时间】:2015-04-21 06:45:20
【问题描述】:

我在 mysql 数据库中的一个大型 InnoDB 表上运行了一个不明智的 SELECT *

所以大约 10 分钟后,我意识到了错误,使用 show processlist 找到了connectionid,并尝试使用 kill 命令终止连接和查询。然后我在同一张表上运行了另一个查询。

show processlist 显示原始选择已收到 Killed 标志,但卡在“发送数据”状态。后续查询正在等待锁定。这已经持续了几个小时。

现在我明白了,如果我的原始查询以任何方式修改了表,我所描述的将等待回滚。

但这是select;回滚选择甚至意味着什么?

所以我想知道是否有人可以告诉我我在等待什么,以及是否有任何方便的方法可以取消 select 查询。

【问题讨论】:

  • 这里可能已经回答了问题:stackoverflow.com/questions/5043268/…
  • "如果表 email_data_test 是 InnoDB,那么很多 MVCC 数据正在写入 ib_logfiles,这可能还没有发生。"
  • 感谢您的链接;这不是我在发布前搜索中找到的示例之一,但它与我找到的示例相似。他们在该线程中给出的解释为什么需要这么长时间才能杀死 - 除了为什么原始查询首先需要这么长时间 - 是“杀死查询只会导致 InnoDB 表 email_data_inno_stage 执行回滚。”这又回到了我最初的问题:为什么我需要回滚选择?
  • 足够我编辑帖子的标题了。我希望这不会让任何人都难以追踪这个问题,但我在 meta-SO 上发现了一些帖子,似乎表明如果你想出一个更好的标题,那就值得去做。如果不合适,当然可以随意将其改回,或者您认为新标题更糟。 (具体来说,我认为这个更好,因为它将这个问题与已经在 SO 上回答过的数字区分开来,但是关于 INSERT / DELETES,回滚将是完全明智的。)
  • 您不需要回滚 SELECT。仅仅因为终止写入查询通常会导致数据库回滚时的较长等待时间,并不意味着终止读取查询后的较长等待时间也是由于回滚。听起来好像还有其他事情发生。

标签: mysql sql innodb sql-optimization


【解决方案1】:

正如其他人所说,您不是在等待事务回滚。我也遇到过这个问题:称它为错误,因为它确实是一个虽然 MySQL 不同意的问题。

现在我只能给你一个有根据的猜测,因为你得到这个“僵局”的原因,但我可以给你一个解决方案:

解锁表格http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html

【讨论】:

    猜你喜欢
    • 2020-01-18
    • 1970-01-01
    • 2021-10-28
    • 2023-04-06
    • 1970-01-01
    • 2017-04-03
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多