【问题标题】:TransactionScope and deadlocks in sprocsproc 中的 TransactionScope 和死锁
【发布时间】:2012-06-11 22:37:16
【问题描述】:

我有一个sproc,基本上是这样的:

begin transaction
    SELECT
    UPDATE
    INSERT
commit transaction

这个sproc 在我的应用程序中的两个不同线程的循环中被调用,两个线程都在TransactionScope 中使用默认选项。

有时,我的应用程序会死锁:

“事务(进程 ID 184)在锁定资源上与另一个进程死锁,并已被选为死锁牺牲品。重新运行事务。”

对此我能做些什么吗?我应该使用不同的隔离级别吗?

【问题讨论】:

    标签: sql-server-2005 c#-4.0 transactionscope


    【解决方案1】:

    TransactionScope 使用的默认隔离级别是 Serializable,这通常是不必要的。使用带有TransactionOptionsconstructor 来指定其他级别。

    示例基于来自 David Baxter Browne 的博客文章(描述此问题的精彩博客文章)。

    TransactionOptions tOptions= new TransactionOptions();
    tOptions.IsolationLevel = IsolationLevel.ReadCommitted;
    using (TransactionScope transaction = new TransactionScope(TransactionScopeOption.Required, tOptions))
    {
      // do stuff here
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多