代码之家  ›  专栏  ›  技术社区  ›  Otávio Décio

ORM支持处理死锁

  •  7
  • Otávio Décio  · 技术社区  · 16 年前

    5 回复  |  直到 16 年前
        1
  •  4
  •   realMarkusSchmidt    16 年前

    出于同样的原因,您可能不会确保只尝试重新运行同一事务一次。

        2
  •  1
  •   John Ellinwood    16 年前

    死锁是意料之中的,SQL Server在这方面似乎比其他数据库服务器更糟糕。首先,你应该尽量减少死锁。尝试使用 SQL Server Profiler

        3
  •  0
  •   Frans Bouma    16 年前

    为了确保一段代码不会造成死锁,请始终使用以下规则: -在交易之外进行提取。因此,首先获取,然后执行处理,然后执行DML语句,如插入、删除和更新 -包含/处理事务的方法或一系列方法中的每个操作都必须使用与数据库的相同连接。这是必需的,因为例如在同一连接上执行的语句会忽略写锁(因为同一连接设置了锁;)。

        4
  •  0
  •   Robin    16 年前

    如果你遇到死锁问题,一定要遵循这里发布的一些建议来尝试解决它们。之后,您只需要确保所有数据库访问代码都被能够检测死锁并重试事务的东西所包裹。

        5
  •  0
  •   Ian Ringrose    16 年前

    While(true)
       start a database transaction
       Foreach command to process
          read data the command need into objects
          update the object by calling the command.run method
       EndForeach
       Save the objects to the database
       If not deadlock
         commit the database transaction
        we are done
       Else 
         abort the database transaction
        log deadlock and try again
       EndIf
    EndWhile
    

    当用户与系统交互时,我们在事务之外运行命令。然后如上所述重新运行它们(当您使用“保存”时),以应对其他人所做的更改。由于我们已经对命令将更改的行有了一个很好的理想,我们甚至可以使用锁定提示或选择更新来取出事务开始时所需的所有写锁。(我们缩短了要更新的行数,以进一步减少死锁的数量)