TransactionScope和sproc中的死锁

时间:2011-07-04 17:16:12

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

我的sproc基本上就是这样:

begin transaction
    SELECT
    UPDATE
    INSERT
commit transaction

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

偶尔,我的应用程序死锁:

  

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

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

1 个答案:

答案 0 :(得分:2)

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

基于David Baxter Browne博客文章的例子(一篇描述此问题的精彩博文)。

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