【问题标题】:Entity Framework and transaction isolation level实体框架和事务隔离级别
【发布时间】:2012-10-09 07:45:25
【问题描述】:

我正在使用实体框架 4.0。现在我需要在读取或写入表时限制对表的访问。可能这与事务隔离级别有关。

我该怎么做?

更新

这就是我所拥有的

using (var db = new MyDb())
{
    using (TransactionScope scope = new TransactionScope())
    {
        var item = db.MyItems.Single(x => x.Id == 5);
        item.Price = 12;
        db.SaveChanges();
        scope.Complete(); 
    }
}

但是,当我在 using (TransactionScope scope 内的任何行放置断点时,当我停在那里,然后我转到 Sql Server Management Studio 并从正在使用的表中执行选择查询(甚至更新!)在交易中,由于某种原因,我没有收到错误。但为什么?它不能让我在事务执行时读取数据。

【问题讨论】:

标签: c# .net entity-framework transactions


【解决方案1】:

默认情况下,事务有一个可序列化的IsolationLevel。可序列化是最高级别。它要求事务在允许任何其他事务对数据进行操作之前完成。

有以下限制:

  • 语句无法读取已修改但尚未修改的数据 由其他事务提交。
  • 没有其他事务可以修改 当前事务已读取的数据直到当前 交易完成。
  • 其他事务不能插入新行 将落在任何读取的键范围内的键值 当前事务中的语句直到当前事务 完成。

这是一篇很棒的博文,解释了如何将事务与实体框架一起使用:Entity Framework transaction scope examples

更新

在 Entity Framework 6 中,对于使用 Code First 创建的数据库,默认 IsolationLevel 更改为 READ_COMMITTED_SNAPSHOT,这可能允许更高的可伸缩性和更少的死锁。见future spec of EF 6

【讨论】:

  • >所以我不需要做任何其他事情吗?为什么说“任何其他交易”?可能不会有other transaction,而只有一个查询,例如select * from my_table?
  • Serializable 是最高的事务级别。它允许易失性读取,但不允许修改。我不知道这是否完全涵盖了您的情况,因为您还想禁止阅读。如果您通过实体框架运行命令,它将始终使用事务。如果您手动执行 Sql 查询,则必须手动将其放入 TransactionScope。
  • 我没有在 C# 代码中手动使用 sql 查询。所以我不必使用TransactionScope,对吗?
  • EF 将使用默认事务范围。如果您需要自定义设置,则只需要使用自定义 TransactionScope。
  • @WouterdeKort 如何在实体框架中设置自定义事务范围和 TransactionScopeAsyncFlowOption
猜你喜欢
  • 2012-08-01
  • 1970-01-01
  • 2015-10-03
  • 2012-04-03
  • 1970-01-01
  • 2016-09-02
  • 2011-09-30
  • 2011-02-24
  • 1970-01-01
相关资源
最近更新 更多