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
级别不起作用,因为数据库不支持该级别。
更新是死锁配置文件