2009-12-13 60 views
2

在具有SQL Server故障转移群集或镜像的环境中,您希望如何处理错误?好像有两种选择:处理由于服务器故障转移而失败的数据库查询

  1. 舍弃整个当前客户端的请求,并让用户重试
  2. 捕获的错误在你的DAL,并重新出现

每种方法都有其利弊和缺点。我与之合作过的大多数商店都是排名第一的,但其中许多商店也不遵循严格的交易限制,而且在我看来,如果发生失败,我将面临麻烦。即便如此,我在将它们转换为#2时遇到了困难,这也应该会带来更好的用户体验(一种捕获是发生故障转移时可能存在的长时间延迟)。

任何参数或其他方式将不胜感激。如果您使用第二种方法,您是否有标准包装程序来帮助简化实施?无论哪种方式,您如何构建代码以避免诸如与失败的命令缺乏幂等相关的问题?

回答

0

2号可能是一个无限循环。如果它与网络有关,或者本地PC需要重新启动,或者其他什么?

当然,1号令人讨厌用户。

如果您只允许通过网站访问,那么您将永远不会看到错误,除非故障转移发生在呼叫中。对我们来说,这不太可能,如果最终用户没有意识到,我们就会失败。

在现实生活中,您可能没有在Web服务器上清洁DAL。你可能有一个连接(大多数财务)或WinForms连接保持打开的Excel工作表,所以你只有一个选项。

无论如何,故障切换只需要几秒钟。如果数据库恢复比这更多,那么无论如何你都有更大的问题。如果它经常发生,不得不考虑处理它,那么...

总之,它会发生很少,你想知道和数字1会更好。恕我直言。

+0

难道你不能避免与重试计数器的无限循环?如果您的故障转移只需要几秒钟,那么您很幸运。我所使用的大多数基于SQL Server群集的系统至少需要30秒才能将所有内容全部回滚,并且在备用服务器上的高速缓存填充时还会有额外的延迟 - 并且可能长达2分钟。镜子只有几秒钟,但我工作的大多数商店都没有使用它们。 – RickNZ 2009-12-13 08:08:37

+0

通过几个,我的意思是20-30秒:用户不会注意到。什么将是一个有效的重试计数?它处理超时,死锁吗?它只会重试强制断开连接吗? etc等 – gbn 2009-12-13 08:18:34

+0

我通常使用重试计数为2,并在两者之间延迟。这个想法不是为了防止用户看到错误;只是为了尽量减少发生的机会。你如何确保在失败后的同一页失败的命令发出之前插入成功?除了谨慎的交易设计之外,还有什么? – RickNZ 2009-12-13 10:11:07

相关问题