我今天注意到我的应用程序出现了几个错误,它试图将记录插入表中,但由于临时网络延迟而收到超时错误。应用程序被编码为识别这一点并在这种情况下重试,它乖乖地这样做了。但是在重试时,它遇到了主键违规 - 主要是因为第一个插入语句实际上已经完成,但是发生了超时,将响应传输回客户端。应用程序认为主键违规是一个不应该发生的严重逻辑错误,因此它中止了整个过程。
对我来说,问题是逻辑上应该由哪一层负责处理这类事情?理想情况下,我会认为 SQL 客户端库(在本例中为 ADO.NET 4.0)应该这样做,但它没有我所知道的自动重试机制。鉴于它没有,似乎有一个可以使用 SQL 客户端库的低级包装器的情况,但是如果没有更多关于超时发生时间的信息的访问权限,我看不出它是如何编写的:例如在这个某种例子有可能
a) INSERT 语句只是使用自动递增键插入新记录,因此在超时后重试会导致插入重复记录,或者 b) 主键违规实际上是一个逻辑错误,并且最初尝试插入如果没有发生超时,aa 记录将产生相同的违规
OTOH 我敢肯定我可以想到是否重试只能在应用程序级别确定的示例(尤其是在需要用户确认的情况下)。
实际上,我有点惊讶我以前从未见过这种特别的错误序列,因为在实践中似乎很有可能。