我正在用C#编写一个访问SQL Server2005数据库的应用程序。这个应用程序是数据库密集型的,即使我试图优化所有的访问,建立适当的索引等等,我预计我迟早会得到死锁。我知道为什么会发生数据库死锁,但我怀疑我是否能够发布软件,而不会在某个时候发生死锁。应用程序正在使用Entity Framework进行数据库访问。
在C#客户端代码中是否有处理SQLExceptions (死锁)的好模式-例如,在x毫秒后重新运行语句batch?
澄清一下,我不是在寻找一种方法来避免死锁(隔离级别、索引、语句顺序等),而是在它们实际发生时如何处理它们。
发布于 2010-01-14 00:56:57
前段时间我发布了一个代码样本来处理这个问题,但在此期间我似乎丢失了我的帐户,所以我现在找不到它了,我恐怕也没有我在这里使用的代码。
简而言之--把东西包装在一个try..catch中。如果您捕获到一个看起来像死锁的错误,请休眠一小段随机时间,并递增一次重试计数器。如果您得到另一个错误或者重试计数器清除了阈值,则将错误抛回调用例程。
(如果可以的话,试着把它放在一个通用的例程中,并通过它运行大部分/所有的DB访问,这样您就可以在整个程序范围内处理死锁。)
编辑:啊,教我不要用谷歌!我和其他人给出的前一个代码示例是在How to get efficient Sql Server deadlock handling in C# with ADO?
发布于 2010-01-13 22:23:40
这是我们在我工作的上一个应用程序框架中采用的方法。当我们检测到死锁时,我们只是简单地重新运行事务。我们这样做了5次。如果5次失败后,我们将抛出一个异常。我不记得第二次尝试失败过的时候。我们之所以知道,是因为我们记录了后端代码中的所有活动。因此,我们知道死锁发生的任何时间,并且知道它是否失败超过5次。这种方法对我们来说效果很好。
兰迪
https://stackoverflow.com/questions/2056850
复制相似问题