Шаг 12 - Методы BeginTrans, CommitTrans, Rollback

Описание
BeginTrans открывает новую транзакцию.
CommitTrans завершает текущую транзакцию и сохраняет изменения.
Rollback отменяет текущую транзакцию и восстанавливает базы данных, принадлежащие объекту Workspace, в том состоянии, в котором они находились перед началом текущей транзакции.

рабочаяОбласть.BeginTrans | CommitTrans [dbFlushOSCacheWrites] | Rollback

Параметры
рабочаяОбласть
Прототип рабочаяОбласть представляет объектную переменную, задающую объект Workspace, содержащий базы данных, которые используют транзакции.

Замечания
Данные методы объекта Workspace применяются в том случае, когда требуется выполнить как одну операцию ряд изменений, вносимых в базу данных в сеансе работы.
Как правило, транзакции используются для обеспечения целостности данных, когда требуется одновременно обновить записи в двух или нескольких таблицах и необходимо обеспечить, чтобы изменения были занесены во все таблицы (завершить транзакцию) или не были занесены ни в одну (свернуть транзакцию). Например, при переводе денег с одного счета на другой следует снять необходимую сумму с одного счета и добавить ту же сумму на другой счет. Если любая из операций обновления не будет выполнена, то баланс счетов будет нарушен. В подобном случае следует применить метод BeginTrans перед обновлением первой записи, а затем, если любое из последующих обновлений будет неудачным, применить метод Rollback для отмены всех обновлений. После успешного завершения последнего обновления следует применить метод CommitTrans для сохранения изменений.
В рабочей области Microsoft Jet пользователь имеет возможность задать в методе CommitTrans константу dbFlushOSCacheWrites, Это приводит к принудительной записи на диск всех обновлений вместо их помещения во временный буфер. Без этого параметра пользователь может перехватить управление сразу после вызова метода CommitTrans программой приложения, выключить компьютер, и отказаться от записи данных на диск. Хотя включение данного параметра может сказаться на быстродействии приложения, это оказывается полезным в ситуациях, когда возможно отключение компьютера до сохранения на диске кэшированных изменений.
В пределах одного объекта Workspace транзакции всегда являются глобальными и не ограничиваются только одним объектом Connection или Database. Если операции транзакции проводились в пределах одного сеанса работы над несколькими подключениями или базами данных в объекте Workspace, то разрешение транзакции (т.е. вызов метода CommitTrans или Rollback) затрагивает все операции для всех подключений и баз данных в этой рабочей области.
После вызова метода CommitTrans отмена внесенных во время транзакции изменений становится невозможной за исключением случая, когда данная транзакция была вложена в другую транзакцию, которую можно свернуть. При использовании вложенных транзакций необходимо разрешить текущую транзакцию до разрешения транзакции высшего уровня вложенности.
Если требуется одновременно выполнять несколько независимых (не вложенных) перекрывающихся транзакций, то следует создать дополнительные объекты Workspace, которые будут содержать конкурирующие транзакции.
Если объект Workspace будет закрыт без явного завершения или отмены открытых транзакций, то транзакции будут автоматически свернуты.
Попытка вызвать методы CommitTrans или Rollback без предварительного вызова метода BeginTrans приводит к ошибке.
Некоторые базы данных ISAM, используемые в рабочей области ядра Microsoft Jet, могут не поддерживать транзакции. В этом случае свойство Transactions объекта Database или Recordset получает значение False. Для того чтобы проверить, поддерживает ли база данных транзакции, следует проверить значение свойства Transactions объекта Database перед вызовом метода BeginTrans. При работе с объектом Recordset, содержащим записи из нескольких баз данных, следует проверить значение свойства Transactions объекта Recordset. Если объект Recordset создан только на основе таблиц Microsoft Jet, то транзакции всегда возможны. Объекты Recordset, базирующиеся на таблицах, созданных в других СУБД, могут не поддерживать транзакции. Например, не допускается выполнение транзакций для объекта Recordset, созданного на основе таблицы Paradox. В этом случае свойство Transactions имеет значение False. Если объекты Database или Recordset не поддерживают транзакции, то вызовы методов управления транзакциями игнорируются и ошибка не возникает.
Вложенные транзакции нельзя использовать при работе с источниками данных ODBC с помощью ядра базы данных Microsoft Jet.
Объединение операций с базой данных, требующих обращения к диску, в блоки транзакций часто позволяет повысить производительность приложения. Такой подход обеспечивает буферизацию операций и может сильно уменьшить число обращений к диску.
В рабочей область ядра Microsoft Jet транзакции регистрируются в файле, который сохраняется в каталоге, указанном в переменной среды TEMP, определенной для данной рабочей станции. Если файл журнала транзакций исчерпывает доступное пространство на диске, на котором находится каталог TEMP пользователя, ядро базы данных генерирует ошибку выполнения. В таком случае при вызове метода CommitTrans результаты некоторых операций окажутся занесенными, а результаты остальных незавершенных операций будут потеряны. Это делает необходимым повторение операции. Вызов метода Rollback освобождает файл журнала транзакций и свертывает все операции транзакции.

Пример
Следующая программа открывает три рабочие области ODBCDirect и задает в них для свойства IsolateODBCTrans значение True, обеспечивая изоляцию множественных транзакций.

Sub IsolateODBCTransX()

	DBEngine.DefaultType = dbUseJet
	Dim wrkJet1 As Workspace
	Dim wrkJet2 As Workspace
	Dim wrkJet3 As Workspace
	' Открывает три рабочие области ODBCDirect для изоляции 
	' транзакций, использующих общий источник данных ODBC.
	Set wrkJet1 = CreateWorkspace("", "admin", "")
	wrkJet1.IsolateODBCTrans = True
	Set wrkJet2 = CreateWorkspace("", "admin", "")
	wrkJet2.IsolateODBCTrans = True
	Set wrkJet3 = CreateWorkspace("", "admin", "")
	wrkJet3.IsolateODBCTrans = True
	wrkJet1.Close
	wrkJet2.Close
	wrkJet3.Close

End Sub

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 20.02.2002