【问题标题】:Entity Framework timeouts when transaction is running事务运行时实体框架超时
【发布时间】:2016-05-27 09:06:04
【问题描述】:

我有一个很长的请求,正在使用事务将数据导入系统。问题是,当单个事务运行时,在此期间对它正在使用的表的其他请求被阻止并且永远运行并以超时异常

等待操作超时

即使事务正在那里运行,我怎样才能允许正常读取数据。

附:我不认为这是一个 SQL 悲观数据锁,因为在事务期间我可以使用 SQL Management Studio 从表中选择数据。

【问题讨论】:

  • 我坚持在 ADO.NET 中使用 SqlBulk,因为您的场景实体不适合。我有同样的问题并通过不使用实体来解决。

标签: c# sql asp.net-mvc entity-framework entity-framework-6


【解决方案1】:

您可以在 SQL Server 中启用Snapshot Isolation,它与设置 READ_COMMITTED_SNAPSHOT 设置一起将改变您所看到的行为。

当一个长时间运行的事务正在进行时,其他表不会被锁定,而是会看到该表中在事务开始之前的行。

要启用此功能:

ALTER DATABASE MyDatabase SET ALLOW_SNAPSHOT_ISOLATION ON
ALTER DATABASE MyDatabase SET READ_COMMITTED_SNAPSHOT ON

如果您的数据库是由 Code-First 迁移创建的,这实际上是 Entity Framework 6 中的默认行为。

【讨论】:

  • 他们还能导入其他数据吗?
  • 为什么标准读取提交级别不显示以前提交的条目,而不是阻止访问?
  • 因为 Read Committed 不是 Read Committed Snapshot - 这就是区别。使用快照时,事务运行时会保留多个受影响行的版本。
  • 奇怪的是,我首先使用带有代码的 EF 6,但默认情况下未启用 - 有什么想法吗?
  • 您是否手动创建了数据库?此更改仅在创建数据库时发生。
猜你喜欢
  • 1970-01-01
  • 2016-11-18
  • 1970-01-01
  • 2011-09-08
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
  • 2017-05-19
相关资源
最近更新 更多