在我们的开发团队中,我们有一个关于在Entity Framework中读取期间打开事务的有趣讨论。
案例是这样的:我们在MVC app中有工作单元,它跨越了动作方法 - 在执行动作之前简单的打开EF事务,并在执行期间没有出现错误后提交。这很好,也许你们中的一些人以这种方式使用带有EF的UoW模式。
有趣的部分是关于仅执行读取的操作(不修改任何实体,例如通过id获取)。交易是否也应该打开以进行读取?当我们不打开交易时,方法有什么不同,在读取期间,同一个表上存在活动交易我们读取的数据不使用tran?假设我们已将默认事务隔离级别设置为read committed。
我是专业开放交易,保持读数一致,但有些事情反对像交易减速读取(这是真的,但我不知道多少)。
你有什么想法?我知道有些人会像老建筑师那样回答说#34;它取决于"但我需要强烈的论据而不是讨厌:)
答案 0 :(得分:1)
对于处于READ COMMITTED隔离的SQL Server,事务中的SELECT与事务外的SELECT之间没有区别。
使用旧的READ COMMITTED,即使在事务中,也会在每个查询结束时释放S锁。
使用READ COMMITTED SNAPSHOT(这是EF Code First的默认设置),没有采用S锁,行版本仅提供数据库的语句级时间点视图。
在SNAPSHOT隔离时,整个事务将在单个时间点看到数据库,仍然没有锁定。