实体框架和事务隔离级别

时间:2012-10-09 07:45:25

标签: c# .net entity-framework transactions

我正在使用Entity Framework 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并从一个表中执行一个select查询(甚至更新!)在事务中使用,我出于某种原因没有收到错误。但为什么?它必须不允许我在事务执行时读取数据。

1 个答案:

答案 0 :(得分:28)

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

它有以下限制:

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

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

更新

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