Entity Framework and transaction isolation level

49,659

By default, a Transaction has an IsolationLevel of Serializable. Serializable is the highest level. It requires that the transaction completes before any other transaction is allowed to operate on the data.

It has the following restrictions:

  • Statements cannot read data that has been modified but not yet committed by other transactions.
  • No other transactions can modify data that has been read by the current transaction until the current transaction completes.
  • Other transactions cannot insert new rows with key values that would fall in the range of keys read by any statements in the current transaction until the current transaction completes.

This is a great blog post that explains how to use Transactions with the Entity Framework: Entity Framework transaction scope examples

UPDATE

In Entity Framework 6 the default IsolationLevel is changed to READ_COMMITTED_SNAPSHOT for databases created using Code First, potentially allowing for more scalability and fewer deadlocks. See the future spec of EF 6

Share:
49,659
Alan Coromano
Author by

Alan Coromano

Updated on November 19, 2020

Comments

  • Alan Coromano
    Alan Coromano over 3 years

    I'm using Entity Framework 4.0. Now I need to restrict access to a table while I'm reading from it or writing to it. Probably that's about transaction isolation level.

    How do I do that?

    Update

    here is what I have

    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(); 
        }
    }
    

    However, when I put a breakpoint at any line inside using (TransactionScope scope and when I'm stopping there and then I go to Sql Server Management Studio and doing a select query (or even update!) from a table that is using inside a transaction, I'm not getting an error for some reason. But why? It must not allow me to read a data while a transaction is executing.

  • Alan Coromano
    Alan Coromano over 11 years
    <<before any other transaction is allowed >> So don't I have to do anything else? And why did you say "any other transaction"? It might happen that there will be not other transaction but just a query such as select * from my_table?
  • Wouter de Kort
    Wouter de Kort over 11 years
    Serializable is the highest transaction level. It allows volatile reads but it doesn't allow modifications. I don't know if this totally covers your scenario since you also want to disallow reading. If you run your commannds trough the Entity Framework it will always use a transaction. If you execute your Sql query by hand you will have to manually put it in a TransactionScope.
  • Alan Coromano
    Alan Coromano over 11 years
    I'm not using sql queries manually in a C# code. So I don't have to use TransactionScope, do I?
  • Wouter de Kort
    Wouter de Kort over 11 years
    EF will use a default transaction scope. You will only need to use a custom TransactionScope if you want custom settings.
  • 3 rules
    3 rules over 7 years
    @WouterdeKort How to set custom transaction scope and TransactionScopeAsyncFlowOption in Entity Framework
  • andrew pate
    andrew pate almost 7 years
    I think Wouter above explains why your not seeing an error. However this article on TransactionScope implies you may still have concurrency problems should two threads try to modify the same entity: ladislavmrnka.com/2012/09/…