使用事务范围的最佳方式

时间:2018-05-05 15:49:41

标签: c# sql-server entity-framework transactions

我在Entity Framework中使用了一个事务。但我不知道在哪里放置交易范围。应该在开始之前,在我为实体做一些处理之前。或者我应该在实体处理之后但在我调用save之前将它放入。因为我读到交易应该尽可能短。

我应该这样做吗

using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) 
{ 
    using (var context = new MyDbContext(conn, contextOwnsConnection: false)) 
    { 
        var query = context.Posts.Where(p => p.Blog.Rating > 5); 

        foreach (var post in query) 
        { 
            post.Title += "[Cool Blog]"; 
        } 

        await context.SaveChangesAsync();                               
    }
}

或者这个(保存/提交之前的最后范围)

using (var context = new MyDbContext(conn, contextOwnsConnection: false)) 
{   
    var query = context.Posts.Where(p => p.Blog.Rating > 5); 

    foreach (var post in query) 
    { 
          post.Title += "[Cool Blog]"; 
    } 

    using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) 
    { 
        await context.SaveChangesAsync();                         
    }                             
}

1 个答案:

答案 0 :(得分:0)

为了回答您的问题,我们首先要了解为什么我们开始使用交易范围。 e.g。

让我们想象你想买一辆车,但你已经拥有了一辆车,所以你想交易你的车。

public bool TradeCar(Car myCar, Car otherCar)
{
    otherCar.Owner = "Me";
    myCar.Owner = "Other Dude";

    return true;
}

现在想象一下,应用程序在myCar.Owner = "Other Dude"行中出于某种原因崩溃,现在你有2辆车!

如果你是一个小偷,那真是太好了,但我们都是好人,我们希望一切尽可能顺利。

所以我们添加一个事务范围!

using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
    otherCar.Owner = "Me";
    myCar.Owner = "Other Dude";

    return true;

}

现在,如果你的代码因任何原因崩溃,你们两个都保证不会失去他们的车!

因此,只要你没有做任何想象,你就可以将事务范围放在一边,如果我打算用数据库做更多的操作,我通常会在调用开始时使用它。