实体框架6在高负载下失败

时间:2015-02-18 02:47:07

标签: c# sql-server entity-framework

我正在对我的网站进行压力测试。它使用实体框架6。

我有10个帖子。这就是他们正在做的事情:

  1. 从网上获取一些数据。
  2. 创建新的数据库上下文。
  3. 创建/更新数据库中的记录使用Database.SqlQuery(sql).ToList()读取和Database.ExecuteSqlCommand(sql)写入(约200条记录/秒)
  4. 关闭背景
  5. 在数据库死锁异常的情况下,它会在2分钟内崩溃(在读取时始终如一!)。

    我已尝试在交易中包装步骤2-4,但这没有帮助。

    我已经读过,从EF6开始,默认情况下,ExecuteSqlCommand被包装在一个事务中(https://msdn.microsoft.com/en-us/data/dn456843.aspx)。如何关闭此行为?

    我甚至不理解为什么我的事务处于死锁状态,它们是读/写独立行。

    是否有数据库设置我可以在某处增加挂起的事务队列的大小?

2 个答案:

答案 0 :(得分:0)

我怀疑EF与它有什么关系。即使您正在读/写独立行,锁也可以升级并锁定页面。如果您不小心数据库设计,以及如何执行读写(顺序很重要),您可以使用EF或任何其他访问技术进行死锁。

答案 1 :(得分:0)

正在使用什么交易类型? .Net的TransactionScope默认为SERIALIZABLE,至少在我认为不使用EF的应用程序中。与其他类型(如ReadCommitted)相比,SERIALIZABLE事务在我的体验中更容易死锁。