Лучший способ использовать объем транзакции - PullRequest
0 голосов
/ 05 мая 2018

Я использую транзакцию в Entity Framework. Но я не уверен, где поставить объем сделки. Должно ли это быть в начале, прежде чем я сделаю некоторую обработку для объекта. Или я должен поставить его после обработки объекта, но прежде чем я вызову сохранить. Потому что я прочитал, что транзакция должна быть как можно короче.

Должен ли я сделать это

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 голосов
/ 05 мая 2018

Хорошо, чтобы ответить на ваш вопрос, мы сначала должны выяснить, почему мы используем области транзакций для начала. например,

Представим, что вы хотите купить машину, но у вас уже есть машина, поэтому вы хотите продать свою.

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;

}

Теперь, если ваш код вылетает по какой-либо причине, вы оба гарантируете, что не потеряете их машину!

Так что, пока вы ничего не делаете, вы можете оставить область транзакции в стороне, я обычно использую ее в начале вызова, если собираюсь выполнить более 1 операции с базой данных.

...