我在两个不同的服务器上有两个不同的数据库,并且使用了TransactionScope
。我是第一次使用TransactionScope
。
但是在更新表1时并发我遇到了错误
事务(进程ID 64)与另一个进程在锁定资源上死锁,因此被选择为死锁受害者。重新运行事务。
在网上查看了TransactionScope
条相关文章
option.IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted;
option.Timeout = TimeSpan.FromMinutes(1);
using (_objTransactionScope = new TransactionScope(TransactionScopeOption.Required, option))
{
//..Open Connection
//..Process the Document
//..Update Additional information in Table2 about document(Delete/Insert)
//..Update Location Information in Table3 about document(Delete/Insert)
//..Delete the Document in Table4 in Differant Database on Differant Server(WCF Service)
//..Update the Checksum of the Document and Metadata in Table1(Deadlock Error in concurrency)
//..Delete Lock Entry From Table5
//..Close Connection
//..Commit Transaction Scope
}
答案 0 :(得分:1)
当两个用户在单独的对象上具有锁并且每个用户都希望在另一个对象上具有锁时,就会发生死锁。发生这种情况时,SQL Server通过自动选择一个并中止该进程来终止死锁,从而允许另一个进程继续进行。被中止的事务被回滚,并且错误消息被发送到被中止的进程的用户。通常,需要最少开销回滚的事务就是已中止的事务。
解决方案: 死锁优先级可以由用户设置。换句话说,用户可以选择应该停止哪个进程以允许其他进程继续。 SQL Server自动选择正在运行的终止进程来完成循环的锁链。有时,它会选择运行时间短于其他进程的进程。