代码之家  ›  专栏  ›  技术社区  ›  Ken Browning

如何避免这些死锁?

  •  1
  • Ken Browning  · 技术社区  · 17 年前

    我有一个例行程序正在更新我的业务实体。更新涉及大约6个不同的表。所有命令都在事务中执行。

    最近,我需要在例程中添加一些代码,该例程从数据库访问查找表。查找代码已经存在于另一个业务对象中,因此我使用了该业务对象。例如:

    Using tr As DbTransaction = myConnection.BeginTransaction()
        ExecuteCommand1(tr)
        ExecuteCommand2(tr)
        If myLookupTable.GetLookupTable().FindById(id).HasFlagSet Then
            ExecuteCommand3(tr)
        End If
    End Using
    

    在做了一些研究之后,我尝试将查找表逻辑放在它自己的事务中,设置 IsolationLevel ReadUncommitted . 这给了我想要的结果。然而,在进一步的研究之后,我现在正在猜测我是否正确地实现了这一点。

    假设我的查找表对象无法使用对活动事务的引用,那么我所描述的是最佳实践吗?我觉得我可能错过了什么。

    4 回复  |  直到 17 年前
        1
  •  3
  •   Remus Rusanu    17 年前

    TransactionScope

    另一种方法是在每次调用时传递SqlConnection/SqlTransaction对,但这会在代码中到处传播。

        2
  •  0
  •   Jeff    17 年前

    如果是我,我会重写逻辑,这样我就不必进行未提交的阅读。

        3
  •  0
  •   sean riley    17 年前

    避免死锁的黄金法则是在每个事务中始终以相同的顺序获取表锁。因此,请查看其他事务中的代码,以了解它们采用表锁的顺序;然后确保在交易中使用相同的顺序。

        4
  •  0
  •   Mehmet Aras    17 年前

    推荐文章