我的sproc
基本上就是这样:
begin transaction
SELECT
UPDATE
INSERT
commit transaction
这个sproc
在我的应用程序中的两个不同线程的循环内调用,都在TransactionScope
范围内,默认选项。
偶尔,我的应用程序死锁:
“事务(进程ID 184)在锁资源上与另一个进程发生死锁,并被选为死锁牺牲品。重新运行该事务。”
我能做些什么吗?我应该使用不同的隔离级别吗?
答案 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
}