2010-10-28 337 views
1

我们遇到了MySQL的神秘网络问题。简单的更新查询(使用索引更新单行)通常会立即运行,然后有时(比如1000倍中的1次)会因超时而失败。与简单的插入查询相同。数据库不会过载。 我们怀疑网络问题,并正在寻找解决方案,所以如果任何人有这样的问题,我一定会想要解决它。在Commit期间MySQL超时

现在的重点。更糟糕的是,插入查询在事务提交期间失败(我们有很少类似的查询,但即使是最简单的查询也会发生这种情况 - 只需将单个表插入单个表中,不需要任何锁定)。当它发生时,transaction.Commit抛出异常。我们捕获它并假定事务已回滚并重试插入数据。

结果是表中有两行数据相同。如果Commit失败,可能会有哪些假设?行插入或不行?这是MySql Connector/Net中的这种行为错误,还是由设计决定的。任何建议(除了手动检查数据是否在表格中)?

在此先感谢。 Branko

p.s. 我发布了这个相同的消息到MySQL .NET连接器论坛。我很抱歉,如果这让任何人困扰,但我越来越绝望。 O :-)

+0

什么时候你打开和关闭连接 - 他们在方法级别,级别等?你能发布一段代码吗? – 2010-10-28 10:37:41

回答

0

如果提交失败并出现网络错误,则不可能做出假设。我知道很难对它进行编程,但它是如此;)增加命令超时可能会有所帮助。但是,如果事务更改在数据库中保持不变,但如果客户端没有收到来自服务器的确认,则连接丢失,则事务状态不确定。

+0

为了在连接错误后允许相对安全的重试,一个好主意可能是在受影响的表中有一个唯一的GUID字段(transaction_id),并在客户端应用程序中生成此GUID。在第一次提交成功的情况下,重试会失败,并出现重复密钥。 – 2011-05-01 00:23:45

+0

谢谢。是的,我们在这一行中使用了一些东西(唯一的密钥,重试时重复的密钥失败)来解决问题。 – dbrank0 2011-05-01 15:06:15