实体框架和事务隔离级别

Ala*_*ano 24 .net c# 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(); 
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我在内部的任何一行放置一个断点时using (TransactionScope scope,当我停在那里然后我去了Sql Server Management Studio并从一个在事务中使用的表做一个select查询(甚至更新!),我因某些原因没有收到错误.但为什么?它必须不允许我在执行事务时读取数据.

Wou*_*ort 31

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

它有以下限制:

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

这是一篇很棒的博客文章,解释了如何在实体框架中使用事务:实体框架事务范围示例

UPDATE

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

  • 可序列化是最高的事务级别。它允许易失性读取,但不允许修改。我不知道这是否完全涵盖了您的情况,因为您也想禁止阅读。如果您通过实体框架运行您的命令,它将始终使用事务。如果您手动执行 Sql 查询,则必须手动将其放入 TransactionScope。 (2认同)