CommittableTransaction.Commit Метод

Определение

Пытается зафиксировать транзакцию.

public:
 void Commit();
public void Commit ();
member this.Commit : unit -> unit
Public Sub Commit ()

Исключения

В транзакции вызывается метод Commit(), и транзакция переходит в состояние InDoubt.

Вызывается метод Commit(), и выполняется первоначальный откат транзакции.

Комментарии

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

Commit и EndCommit блокируются до завершения первой фазы обработки транзакций. Первый этап заканчивается после того, как все диспетчеры ресурсов и зачисления в транзакцию проголосовали за результат транзакции, и TransactionManager явно решил зафиксировать или прервать транзакцию. Второй этап обработки всегда асинхронен. Таким образом, нет никакой гарантии, что данные, зафиксированные из данной транзакции, будут немедленно доступны после этого, если не используется другая транзакция для просмотра этих данных.

Так как этот метод блокируется до завершения первого этапа обработки транзакций, при использовании этого метода в приложении Windows Form (WinForm) или взаимоблокировке может возникнуть взаимоблокировка. При вызове этого метода в одном событии WinForm Control (например, нажатии кнопки) и использовании синхронного Invoke метода для выполнения некоторых задач пользовательского интерфейса (например, изменение цветов) в середине обработки транзакции произойдет взаимоблокировка. Это связано с тем, что Invoke метод синхронен и блокирует рабочий поток, пока поток пользовательского интерфейса не завершит свое задание. Однако в нашем сценарии поток пользовательского интерфейса также ожидает фиксации транзакции рабочим потоком. Результатом является то, что ни один из них не может продолжаться, и область ожидает бесконечного завершения фиксации. Следует использовать BeginInvoke , а не Invoke везде, где это возможно, потому что это асинхронная и, следовательно, менее подверженная взаимоблокировки.

Применяется к