【问题标题】:Handling strategy for (ER_QUERY_INTERRUPTED) on mysqlmysql中(QUERY INTERRUPTED)的处理策略
【发布时间】:2013-07-17 09:33:30
【问题描述】:

我正在为我们的 mysql 服务器编写一个基础架构库。 我必须处理的一种情况是与 mysql 服务器的临时断开连接。

测试场景是开始对数据库进行大约 100000 次插入,然后停止数据库并将其恢复。

在这种情况下,我在停止期间运行的查询明显收到 ER_QUERY_INTERRUPTED 错误。 问题是:

我可以假设数据库的状态(例如查询未开始)将其视为未定义的行为并删除它问题是用户的问题?

【问题讨论】:

  • 只要您在事务中执行此操作,您就可以安全地重试查询。事务期间断开连接将导致 SQL 服务器自动回滚。如果您在事务之外,则查询可能已提交,或者可能未提交。再次插入可能会导致重复数据。
  • @ColinMorelli:如果使用事务存储引擎,例如InnoDB,那么所有操作都在“事务内部”(尽管它们可能会自动提交)。
  • @eggyal 我的意思是非自动提交事务。如果您不明确发送COMMIT,则无法确定在断开连接期间是否执行了查询。
  • 作为对 OP 的附加说明,我不相信有一种通用的好方法来实现这一点。它确实应该是您为应用程序的各个部分解决的问题。然后,您可以选择要使用的标识符,以便您知道是否已插入数据。如果您的表中没有唯一约束(PK 除外),并且您使用自动增量,那么您可能会在某个时候得到重复数据。您可以在应用程序中生成 GUID 作为解决方案。
  • @ColinMorelli:是的,你可以。如果您不发送提交(并且没有自动提交),那么使用事务存储引擎您可以确定事务将被回滚。

标签: java mysql exception-handling error-handling node-mysql


【解决方案1】:

经过一些测试,出现了以下答案。 我们(和大多数人)使用默认模式为 transaction 的 InnoDB。由于ER_QUERY_INTERRUPTED 被发送到客户端,服务器上的查询被回滚。由于这种错误处理策略,在这种情况下,我们将重新提交所有出现此类错误的查询。

【讨论】:

    猜你喜欢
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 2011-01-23
    • 2011-12-26
    • 2010-09-25
    相关资源
    最近更新 更多