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

Применимо к: Windows | Windows Сервером

Transactions

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

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

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

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

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

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

  2. Переместите курсор к нужной записи, вызвав жетмове с JET_MoveFirst, указанным в параметре CRowset . Дополнительные сведения о том, как переместить курсор, см. в статье индексирование в разделе таблицы .

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

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

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

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

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

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

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