Транзакции (события Windows)

Область применения: Windows | Сервер Windows

Transactions

Транзакции ESE — это логические единицы обработки, управляющие тем, как приложение видит строки в базе данных и управляет ими. Приложение может использовать точки сохранения транзакций, чтобы определить, следует ли сохранять или отклонять определенный набор изменений в базе данных. Все транзакции в ESE являются атомарными, согласованными, изолированными и устойчивыми (ACID), как описано ниже.

  • Атомной: Все обновления в транзакции отображаются в базе данных или удаляются.
  • Последовательной: База данных всегда начинается в правовом состоянии и всегда заканчивается другим юридическим государством. Для приложений ESE ядро СУБД будет контролировать некоторые простые ограничения, например уникальность уникального индекса, но само приложение определяет почти все остальные аспекты того, что это означает, что база данных будет находиться в правовом состоянии.
  • Изоляции: Транзакции изолированы от обновлений другими сеансами. Транзакция никогда не будет видеть частичный набор изменений, внесенных другой транзакцией.
  • Прочный: После подтверждения фиксации транзакции ядро СУБД сохраняет изменения в базе данных. Устойчивость транзакции может быть при необходимости отменена по соображениям производительности.

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

В этой процедуре показано, как запустить и зафиксировать транзакцию, которая считывает и обновляет данные в базе данных.

Запуск и фиксация транзакции

  1. Вызовите JetBeginTransaction или JetBeginTransaction2 с идентификатором сеанса, чтобы запустить транзакцию.

  2. Переместите курсор в нужную запись, вызвав JetMove с JET_MoveFirst, указанным в параметре cRow . Дополнительные сведения о перемещении курсора см. в разделе " Индексирование" в разделе "Таблица ".

  3. Вызовите JetGetTableColumnInfo в текущей записи с JET_ColInfo, указанной в параметре InfoLevel, чтобы получить идентификатор столбца. Идентификатор столбца возвращается в структуре JET_COLUMNDEF .

  4. ВызовИте JetSetColumn с идентификатором сеанса, идентификатором таблицы и идентификатором столбца, который обновляется. Данные столбца содержатся в параметре pvData .

  5. Вызовите JetCommitTransaction , чтобы зафиксировать транзакцию в базе данных.

Способ реализации изоляции моментальных снимков в ядре СУБД ESE имеет некоторые важные отличия от традиционных моделей изоляции реляционной базы данных и блокировки. Когда транзакция считывает строку, она всегда может получить доступ к строке без сбоя или ожидания освобождения блокировки другими сеансами. Когда транзакция пытается обновить строку, она будет успешной, если это первый сеанс обновления этой строки, то есть первый модуль записи выигрывает. Если сеанс не является первым средством записи, он немедленно завершится ошибкой конфликта записи. Затем сеанс должен прервать свою транзакцию, подождать (обычно через случайную задержку), чтобы другая транзакция зафиксировать изменения, а затем повторить транзакцию. Ядро СУБД не приведет к автоматическому ожиданию этого сеанса, пока другая транзакция не завершит обновление. Обычно транзакция проверяет, может ли она обновить строку внутри вызова JetUpdate . Если не удается заблокировать строку для обновления, JetUpdate завершится ошибкой с JET_errWriteConflict.

Сеансы ограничены одним потоком с момента начала транзакции до конца транзакции. Рекомендуется выполнять все операции обновления и извлечения в транзакции. ESE также поддерживает такие изменения схемы, как создание таблиц и добавление столбцов внутри транзакции. Изменения как обновления, так и схемы могут выполняться в одной транзакции. После завершения транзакции с помощью JetCommitTransaction обновление регистрируется в файле журнала транзакций. Эти файлы можно использовать для поддержания логически согласованного состояния в случае непредвиденного завершения процесса или завершения работы системы.

Транзакции могут быть вложенными до 7 уровней с соответствующими вызовами JetBeginTransaction и JetCommitTransaction или JetRollback , вложенными друг в друга. Это позволяет приложению откатить часть транзакции без необходимости отката всей транзакции. Вложенный вызов JetCommitTransaction означает, что этот уровень обработки завершен; однако транзакция не фиксируется в базе данных до тех пор, пока не будет зафиксирована транзакция с помощью JetCommitTransaction.

Столбцы обновления escrow можно обновлять одновременно несколькими сеансами без сбоя с Jet_errWriteConflict. Функция JetEscrowUpdate может вызываться только для столбцов эскроу, столбцов, созданных с помощью Jet_bitColumnEscrowUpdate.