【问题标题】:Patterns for handling a SQL deadlock in C#?在 C# 中处理 SQL 死锁的模式?
【发布时间】:2010-01-13 13:21:36
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# sql-server entity-framework


    【解决方案1】:

    不久前我发布了一个代码示例来处理这个问题,但 SO 似乎在此期间丢失了我的帐户,所以我现在找不到它,我害怕并且没有我在这里使用的代码。

    简短的回答 - 将东西包装在 try..catch 中。如果您发现一个看起来像死锁的错误,请随机休眠一小段时间并增加重试计数器。如果您收到另一个错误或重试计数器清除了您的阈值,请将错误返回给调用例程。

    (如果可以,请尝试在一般例程中解决这个问题,并通过它运行大部分/所有数据库访问,以便处理程序范围内的死锁。)

    编辑:啊,教我不要使用谷歌!我和其他人之前给出的代码示例在How to get efficient Sql Server deadlock handling in C# with ADO?

    【讨论】:

      【解决方案2】:

      这是我们在上一个应用程序框架中采用的方法。当我们检测到死锁时,我们只需重新运行事务。我们这样做了多达 5 次。如果 5 次后失败,我们将抛出异常。我不记得第二次尝试失败的时间。我们会知道,因为我们在后端代码中记录了所有活动。所以我们知道任何时候发生了死锁,并且我们知道它是否失败超过 5 次。这种方法对我们很有效。

      兰迪

      【讨论】:

      • 你能告诉我你是如何实际重新运行事务的吗?您是否在每个有事务的地方围绕代码放置了一个简单的 for 循环,或者您是否提出了更通用的解决方案?
      • 我们实现了一个循环。如果事务由于死锁情况而失败,我们将整个事务回滚,并重试最多 5 次。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 2010-09-24
      • 2013-04-22
      • 1970-01-01
      相关资源
      最近更新 更多