事务已被另一个进程锁定在锁定资源上,并已被选择为死锁受害者。重新运行交易

时间:2018-11-19 08:33:12

标签: c# entity-framework deadlock transactionscope

ASP.NET MVC项目4.5和EntityFramework数据库优先。

我有一些命令,当用户单击按钮时会触发该命令

using (TransactionScope scope = new TransactionScope())
{
    using (DbContext context = new DbContext())
    {
      //update about 3 tables
      scope.Complete();
    }
}

另一方面,我还有另一种方法,该方法仅从前面的一个表中读取(不更新任何内容)数据,但是它每2秒工作一次(有一个计时器触发此读取过程)。

问题:有时候(并非总是如此),我在阅读过程(而非更新过程)中收到以下异常情况。

  

System.Data.SqlClient.SqlException:事务(进程ID 57)已与另一个进程在锁资源上死锁,并且已被选择为死锁受害者。重新运行事务。

尽管更新过程正常且成功,并且读取过程失败(有时并非总是如此),但这并不是什么大不了的事情,因为2秒钟后将再次请求成功。 恐怕我没有按照正确的方式进行操作,是否有任何建议可以完全消除此异常?

注意:我以前没有收到此异常,当我开始使用TransactionScope时,我开始收到此异常。

更新(可能的解决方案)
实际上,我按照注释中的建议尝试使用IsolationLevel,实际上,这大大减少了此异常。

我按照以下方式创建了交易

new TransactionScope(TransactionScopeOption.RequiresNew, new TransactionOptions()
        {
            IsolationLevel = IsolationLevel.RepeatableRead
        })

注意:SnapShot级别不起作用,因为数据库不支持该级别。

更新是死锁配置文件

enter image description here

0 个答案:

没有答案