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 везде, где это возможно, так как это асинхронно и, следовательно, менее подвержено взаимоблокировки.

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