【发布时间】: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