Несколько TransactionScope.Complete() в использовании

У меня есть такой код

try
{
    MyModel model = repo.GetData();
    if(model == null)
    {
       return model;
    }
    else
    {
       MyResponse response = checkData();
       if(response)
       {
           return model;
       }

       UpdateData();
    }
}
catch(Exception e)
{
    ....
}
return model;

я хочу добавить TransactionScope как это.

try
{
   using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }))
    {
        MyModel model = repo.GetData();
        if(model == null)
        {
            return model;
        }
        else
        {
            MyResponse response = checkData();
            if(response)
            {
                return model;
            }

            UpdateData();
        }
        ts.Complete();
    }
}
catch(Exception e)
{
    ....
}
return model

И я хочу спросить, это нормально, если у меня есть несколько return утверждение до достижения кода ts.Complete()? Я не могу установить ts в ноль в finally блок, потому что TransactionScope находится внутри блока try.

1 ответ

Чтобы ответить на ваш вопрос: это нормально, чтобы вернуться до trans.Complete()? - Да, это. Транзакция не будет принята и изменения не будут применены. Вот как это работает.

Оператор using запускает.Dispose() в любом senarios, даже когда происходит исключение (или возврат).

При удалении транзакции она будет зафиксирована, если был вызван trans.Complete (), и никакие изменения не будут применены, если не будут вызваны.

Об использовании: Что такое блок C# Using и зачем его использовать?

О Transaction.Dispose(): https://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.dispose(v=vs.110).aspx

Другие вопросы по тегам