2011-07-04 59 views
1

我有一个sproc基本上云:的TransactionScope和死锁在存储过程

begin transaction 
    SELECT 
    UPDATE 
    INSERT 
commit transaction 

sproc被称为从两个不同的线程在我的应用程序在一个循环中,无论是在使用默认选项TransactionScope

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

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

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

回答

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 
} 
+0

谢谢。这会解决僵局吗?我很难理解僵局是从哪里来的。 – Johan

+1

@Johan:使用可序列化会导致死锁。看到这里:http://blogs.msdn.com/b/dbrowne/archive/2010/05/21/using-new-transactionscope-considered-harmful.aspx – Giorgi