Visual Basic |
---|
Public Sub StartTransaction() |
Транзакция - последовательность взаимосвязанных действий, рассматриваемых как единое целое. Другими словами, при открытии транзакции предполагается, что последующие действия должы быть либо выполнены все, либо не выполнено ни одно. Таким образом с помощью механизма транзакций обеспечивается логическая целостность данных в БД.
Для открытия и нормального завершения используются методы StartTransaction Метод - CommitTransaction Метод. В случае сбоя во время выполнения операции нормальное закрытие не будет произведено, и транзакция останется открытой (в том числе в случае аварийного завершения работы приложения) - по этой причине рекомендуется использовать механизм транзакций с большой осторожностью. В данной ситуации необходимо произвести перехват и обработку исключения (обработать событие OnScriptError Событие). Для закрытия транзакции в случае сбоя используются свойство IsActiveTransaction Свойство и метод AbortTransaction Метод, выполняющий откат произведенной операции.
Например, требуется произвести логически взаимосвязанные изменения в 10 объектах (изменить значение некоторого атрибута или сменить статус), причем это изменение должно быть выполнено либо для всех десяти объектов, либо не выполнено совсем:
'=================================================
Sub ChangeStatus(ObjCollection, NewStatusName)
'Открытие транзакции
ThisApplication.StartTransaction
'Блок каскадных изменений
For Each obj In ObjCollection
Obj.Permissions = SysAdminPermissions
For Each child In obj.ContentAll
'Если закомментировать след. строку кода, скорее всего это вызовет ошибку -
' у рядового пользователя могут отсутствовать права на смену статуса.
' Тогда "сработает" перехвать ошибки в OnScriptError, и произведенные
' изменения будут отменены
child.Permissions = SysAdminPermissions
child.StatusName = NewStatusName
Next
Obj.StatusName = NewStatusName
Next
'Нормальное завершение транзакции
ThisApplication.CommitTransaction
End Sub
'=================================================
'Если где-то произошла ошибка, перехватываем ее
Sub OnScriptError(ScriptDescription, Object, Line, Char, ErrorDescription, Cancel)
'Если на момент ошибки транзакция была открыта, откатываем
If ThisApplication.IsActiveTransaction Then ThisApplication.AbortTransaction
End Sub
'=================================================
Таким образом, если произошел сбой операции смены статуса (например, нет прав на смену статуса и т.п.), выполнится откат и все объекты вернутся к первоначальному состоянию.
Метод доступен для вызова всем пользователям TDMS.