Обработка транзакций
Транзакция разделяет начало и конец ряда операций доступа к данным, выполняемых через подключение. При условии транзакционных возможностей источника данных объект подключения также позволяет создавать транзакции и управлять ими. Например, с помощью поставщика Microsoft OLE DB для SQL Server для доступа к базе данных в Microsoft SQL Server можно создать несколько вложенных транзакций для выполняемых команд.
ADO гарантирует, что изменения в источнике данных, вызванные операциями в транзакции, либо успешно происходят вместе, либо не выполняются вовсе.
Если вы отмените транзакцию или если одна из его операций завершается ошибкой, результат будет таким, как если бы ни одна из операций в транзакции не выполнялась. Источник данных останется так, как это было до начала транзакции.
ADO предоставляет следующие методы для управления транзакциями: BeginTrans, CommitTransи RollbackTrans. Используйте эти методы с объектом подключения , если требуется сохранить или отменить последовательность изменений, внесенных в исходные данные как единую единицу. Например, чтобы передать деньги между счетами, вычитаете сумму из одной и добавьте ту же сумму в другую. Если любое из обновлений завершается ошибкой, учетные записи больше не балансируют. Внесение этих изменений в открытую операцию гарантирует, что либо все изменения вступают в силу, либо ни одно из них не вступает.
Заметка
Не все поставщики поддерживают транзакции. Убедитесь, что определяемое поставщиком свойство «Transaction DDL» отображается в коллекции Properties объекта Connection, что указывает на поддержку транзакций поставщиком. Если поставщик не поддерживает транзакции, вызов одного из этих методов вернет ошибку.
После вызова метода BeginTrans поставщик больше не будет мгновенно фиксировать изменения, внесенные до тех пор, пока не вызовете CommitTrans или RollbackTrans, чтобы завершить транзакцию.
Вызов метода CommitTrans сохраняет изменения, внесенные в открытую транзакцию в соединении, и завершает транзакцию. Вызов метода RollbackTrans изменяет все изменения, внесенные в открытую транзакцию, и завершает транзакцию. Вызов любого метода при отсутствии открытой транзакции создает ошибку.
В зависимости от свойства объекта Connection Attributes, вызов метода CommitTrans или RollbackTrans может автоматически инициировать новую транзакцию. Если свойству атрибутов присвоено значение adXactCommitRetaining, поставщик автоматически запускает новую транзакцию после вызова CommitTrans. Если для свойства атрибутов задано значение adXactAbortRetaining, поставщик автоматически запускает новую транзакцию после вызова RollbackTrans.
Уровень изоляции транзакций
Используйте свойство IsolationLevel, чтобы задать уровень изоляции транзакции в объекте Connection. Параметр не вступает в силу до следующего вызова метода BeginTrans. Если уровень изоляции, который вы запрашиваете, недоступен, поставщик может вернуть следующий больший уровень изоляции. Дополнительные сведения о допустимых значениях см. в свойстве IsolationLevel в справочнике программиста ADO.
Вложенные транзакции
Для поставщиков, поддерживающих вложенные транзакции, вызов метода BeginTrans в открытой транзакции запускает новую вложенную транзакцию. Возвращаемое значение указывает на уровень вложения: возвращаемое значение "1" указывает, что вы открыли транзакцию верхнего уровня (то есть транзакцию, которая не вложена в другую транзакцию), "2" указывает, что вы открыли транзакцию второго уровня (транзакцию, вложенную в транзакцию верхнего уровня), и так далее. Вызов CommitTrans или RollbackTrans влияет только на последнюю открытую транзакцию; Перед разрешением любых транзакций более высокого уровня необходимо закрыть или откатить текущую транзакцию.