Sql server 2005 事务范围和存储过程中的死锁
我有一个Sql server 2005 事务范围和存储过程中的死锁,sql-server-2005,c#-4.0,transactionscope,Sql Server 2005,C# 4.0,Transactionscope,我有一个存储过程,基本上是这样的: begin transaction SELECT UPDATE INSERT commit transaction 此存储过程在应用程序中的两个不同线程的循环内调用,这两个线程都位于带有默认选项的事务范围内 有时,我的应用程序会死锁: “事务(进程ID 184)在另一个进程的锁资源上被死锁,并被选为死锁受害者。请重新运行该事务。” 我能做些什么吗?我应该使用不同的隔离级别吗?TransactionScope使用的默认隔离级别是可序列化
存储过程
,基本上是这样的:
begin transaction
SELECT
UPDATE
INSERT
commit transaction
此存储过程
在应用程序中的两个不同线程的循环内调用,这两个线程都位于带有默认选项的事务范围内
有时,我的应用程序会死锁:
“事务(进程ID 184)在另一个进程的锁资源上被死锁,并被选为死锁受害者。请重新运行该事务。”
我能做些什么吗?我应该使用不同的隔离级别吗?TransactionScope使用的默认隔离级别是可序列化的,这通常是不必要的。使用需要指定其他级别的
基于博客文章的示例(描述此问题的一篇很棒的博客文章)
谢谢。这能解决僵局吗?我很难理解死锁从何而来。@Johan:使用serializable可能会导致死锁。请看这里:
TransactionOptions tOptions= new TransactionOptions();
tOptions.IsolationLevel = IsolationLevel.ReadCommitted;
using (TransactionScope transaction = new TransactionScope(TransactionScopeOption.Required, tOptions))
{
// do stuff here
}