2010-01-13 42 views
14

我正在用C#写一个访问SQL Server 2005数据库的应用程序。该应用程序的数据库密集程度相当高,即使我尝试优化所有访问,设置适当的索引等,我期望我迟早会遇到死锁。我知道为什么发生数据库死锁,但是我怀疑我能够在没有发生死锁的情况下发布软件。该应用程序正在使用实体框架进行数据库访问。在C#中处理SQL死锁的模式?

在C#客户端代码中是否有处理SQLExceptions(死锁)的好模式 - 例如在x毫秒后重新运行语句批处理?

澄清;我并不是在寻找如何避免死锁的方法(隔离级别,索引,语句顺序等),而是在实际发生时如何处理它们。

回答

4

下面是我们在上一个应用程序框架中所采用的方法。当我们发现死锁时,我们简单地重新进行交易。我们做了5次。如果5次失败,我们会抛出异常。我不记得第二次尝试失败的时间。我们会知道,因为我们记录了后端代码中的所有活动。所以我们知道任何时候发生了死锁,并且我们知道它是否失败了超过5次。这种方法对我们很有效。

兰迪

+1

您能告诉我您是如何执行事务的实际重新运行吗?您是否在每一个有交易的地方为代码添加了一个简单的循环,或者您是否想出了一个更通用的解决方案? – martin

+1

我们实现了一个循环。如果事务失败,由于死锁情况,我们将整个事务处理回来,然后再次尝试5次。 –

6

我贴了代码示例来处理正是这个而回,但SO似乎失去了我的帐户在此期间,所以我不能找到它现在恐怕并没有我在这里使用的代码。

简短的回答 - 包装在try..catch的东西。如果你捕捉到一个看起来像死锁的错误,那么在短暂的随机时间内休息一下,然后重新计数一次。如果您收到另一个错误或者重试计数器清除了您的阈值,请将错误重新提交给调用例程。

(如果可以,尽量在一般程序来这个塞子,并通过它,所以你正在处理死锁运行大多数/所有的DB访问计划范围内。)

编辑:啊,教教我不要使用Google!前面的代码示例I和其他代码示例为How to get efficient Sql Server deadlock handling in C# with ADO?