mar*_*tin 14 c# sql-server entity-framework
我正在用C#编写一个访问SQL Server 2005数据库的应用程序.该应用程序是数据库密集型的,即使我尝试优化所有访问,设置正确的索引等等,我希望我迟早会遇到死锁.我知道为什么会发生数据库死锁,但我怀疑我能否在没有发生死锁的情况下发布软件.该应用程序正在使用Entity Framework进行数据库访问.
在C#客户端代码中是否有任何处理SQLExceptions(死锁)的好模式 - 例如在x毫秒后重新运行语句批处理?
澄清; 我不是在寻找一种方法,如何首先避免死锁(隔离级别,索引,语句顺序等),而是在实际发生时如何处理它们.
我发布了一个代码示例来处理这一段时间,但是在过渡期间似乎失去了我的帐户所以我现在找不到它我害怕并且没有我在这里使用的代码.
简短的回答 - 将东西包裹在try..catch中.如果你发现一个看起来像死锁的错误,请暂停一小段随机时间并增加重试计数器.如果您收到其他错误或重试计数器清除了您的阈值,请将错误返回到调用例程.
(如果可以,请尝试在常规例程中执行此操作并通过它运行大部分/全部数据库访问,以便在程序范围内处理死锁.)
编辑:啊,教我不要使用谷歌!以前的代码示例我和其他人给出的是如何在C#中使用ADO获得高效的Sql Server死锁处理?
这是我们在我开发的上一个应用程序框架中采用的方法。当我们检测到死锁时,我们只需重新运行事务即可。我们这样做了最多 5 次。如果 5 次后失败,我们将抛出异常。我不记得第二次尝试曾失败过。我们会知道,因为我们正在后端代码中记录所有活动。所以我们知道任何时候发生死锁,并且我们知道它是否失败超过 5 次。这种方法对我们来说效果很好。
兰迪