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

Применимо к: Windows | Windows Server

Transactions

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

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

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

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

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

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

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

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

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

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

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

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

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

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