我在两个不同的服务器上有两个不同的数据库,并且我使用了TransactionScope
。我是第一次使用TransactionScope
。
但是,在更新table1 时并发我遇到了一个错误
交易(过程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
}
僵局发生在两个用户在单独的对象上锁定并且每个用户都希望锁定对方的对象时发生僵局。发生这种情况时,SQL Server通过自动选择一个并流产过程,从而允许另一个过程继续进行僵局。中止交易被向后回滚,并将错误消息发送给中止过程的用户。通常,需要最少的开销到回滚的交易是中止的交易。
解决方案:可以通过用户设定僵局优先级。换句话说,用户可以选择应停止以允许其他过程继续进行的过程。SQL Server会自动选择终止运行的过程,该过程完成了循环链的循环链。有时,它选择了运行较短时间的过程。
阅读本文