Нужно ли мне "actionScope.Complete (); "? - PullRequest
0 голосов
/ 06 декабря 2018

Насколько я понимаю, "правильный" способ использования TransactionScope - это всегда вызывать transactionScope.Complete(); перед выходом из блока using.Например:

using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted }))
{
    //...
    //I'm using this as a NOLOCK-alternative in Linq2sql.
    transactionScope.Complete();
}

Однако я видел, что код работает без него, и даже ответ, который я узнал, чтобы использовать его из , опускает его.Так что мой вопрос, это нужно использовать или нет?

Ответы [ 3 ]

0 голосов
/ 10 декабря 2018

Таким образом, мой вопрос, должен ли он использоваться или нет?

Complete должен использоваться при обновлении для COMMIT транзакции.В противном случае менеджер транзакций выдаст ROLLBACK и отменит внесенные изменения.

В транзакции только для чтения, как в вашем примере, я не могу думать о существенных различиях с Complete или без него.COMMIT или ROLLBACK, выданные менеджером транзакций, будут иметь одинаковый чистый эффект освобождения блокировок и ресурсов, удерживаемых транзакцией в обоих случаях.

Несмотря на то, что не требуется вызывать Complete в транзакции только для чтения, это все же лучший метод IMHO.Представьте себе плохого разработчика, который позже невольно добавляет код модификации данных в блок транзакции, не видя, что Complete отсутствует.

0 голосов
/ 15 декабря 2018

в основном с помощью оператора преобразуется в это во время компиляции компилятором C #

       TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted })
        try
        {
           //your works
        }
        finally
        {
            if (transactionScope != null)
                ((IDisposable)transactionScope).Dispose();
        }

Так что это все, что вы должны ожидать от C # .... вам просто нужно выполнить свою работу с TransactionScope

Если объект TransactionScope изначально создал транзакцию, фактическая работа по фиксации транзакции менеджером транзакций происходит после последней строки кода в блоке using.Если транзакция не была создана, то фиксация происходит всякий раз, когда Commit вызывается владельцем объекта Transaction.В этот момент менеджер транзакций вызывает менеджеров ресурсов и сообщает им о фиксации или откате в зависимости от того, был ли вызван метод Complete для объекта TransactionScope.

вызов этого метода не гарантирует, что транзакция будет зафиксирована,Это просто способ сообщить менеджеру транзакций о вашем статусе.После вызова метода Complete вы больше не можете получить доступ к внешней транзакции с помощью свойства Current, и попытка сделать это приведет к возникновению исключения.

Оператор using гарантирует, что метод Dispose объекта TransactionScopeОбъект вызывается, даже если возникает исключение.Метод Dispose отмечает конец области транзакции.Исключения, возникающие после вызова этого метода, могут не повлиять на транзакцию.Этот метод также восстанавливает исходную транзакцию в предыдущее состояние.

Возникает TransactionAbortedException, если область создает транзакцию и транзакция отменяется.TransactionInDoubtException генерируется, если диспетчер транзакций не может принять решение о фиксации.Исключение не возникает, если транзакция совершена.

надеюсь, это прояснится для вас

0 голосов
/ 06 декабря 2018

Да, вам нужно его использовать, это способ сообщить компилятору о том, что вы успешно выполнили свои задачи, из документов Microsoft по TransactionScope класс:

Когда вашПриложение завершает всю работу, которую оно хочет выполнить в транзакции, вы должны вызывать метод Complete только один раз, чтобы сообщить диспетчеру транзакций, что транзакция приемлема для принятия.Если этот метод не вызывается, транзакция прерывается.

Также для метода Complete :

Если этот метод не вызывается, транзакция прерывается, посколькуМенеджер транзакций интерпретирует это как системный сбой или исключения, выданные в рамках транзакции.Однако следует также отметить, что вызов этого метода не гарантирует фиксацию транзакции.Это просто способ сообщить менеджеру транзакций о вашем статусе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...