只读声明中的实体框架死锁受害者

Vac*_*ano 5 c# entity-framework entity-framework-4 wcf-data-services odata

我有一个OData服务(使用实体框架的WCF数据服务).

所有这些服务都是选择数据.(没有写过.)

当我运行我的OData查询时,我偶尔会收到这样的错误:

事务(进程ID 95)在锁资源上与另一个进程死锁,并被选为死锁牺牲品.重新运行该交易

select语句可以成为死锁受害者吗?或者是实体框架试图锁定不应该锁定的东西?

如果它锁定在它不应该的位置,是否有办法告诉实体框架永远不会锁定?(对于这项服务,它总是永远是只读的.)

usr*_*usr 11

不要只使用ReadUncommitted或NOLOCK.这些将a)容易返回不一致的结果,b)由于"数据移动"而导致虚假错误.别!

更好的想法是使用以下SQL启用快照隔离:

ALTER DATABASE [DB] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE [DB] SET READ_COMMITTED_SNAPSHOT ON;
ALTER DATABASE [DB] SET ALLOW_SNAPSHOT_ISOLATION ON;
ALTER DATABASE [DB] SET MULTI_USER
Run Code Online (Sandbox Code Playgroud)

这将导致读取事务不接受任何锁定,并且不会被现有锁定阻止.这可能会解决您的问题.