我有一个 C# 窗口服务,它与 MS SQL 服务器上的多个数据库通信。它是多线程的,并且有许多函数,每个函数都有长列表的数据库操作,每个这些函数都在自己的事务下运行。因此,典型的函数如下:
public void DoSomeDBWork()
{
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew))
{
DatabaseUpdate1();
DatabaseUpdate2();
DatabaseUpdate3();
DatabaseUpdate4();
DatabaseUpdate5();
DatabaseUpdate6();
}
}
在高负载下我们遇到了死锁问题。我的问题是,如果我编写一些C#代码,在死锁发生时自动重新提交DatabaseUpdate操作,是否会阻塞未提交的操作?例如,如果在DatabaseUpdate6()中发生死锁异常并重试3次,每次等待3秒钟,在此期间所有未提交的操作“DatabaseUpdate 1到5”会占用它们的资源,这可能会进一步增加更多死锁的机会吗?在发生死锁情况时重试是否是一个好的做法?
S
锁不会发生冲突。我建议你使用搜索功能并查看 Remus 在死锁方面的以前的一些答案。我相信你很快就会意识到你最后一个句子中的假设是多么错误! - Martin Smith