GdcBase.TgdcBase.Transaction
Материал из GedeminWiki
| Модуль: GdcBase.pas | Тип: property | Видимость: public | Принадлежит: TgdcBase |
Delphi:
property Transaction: TIBTransaction read GetTransaction write SetTransaction;
Описание
Транзакция на которой происходит изменение данных.
Бизнес-объект имеет два свойства, две транзакции: одна для чтения данных -- ReadTransaction, другая для изменения -- Transaction.
При чтении данных порядок такой:
- Если задана и активна Transaction, то используется она.
- Если задана ReadTransaction, то используется она (при необходимости открывается).
- Если ReadTransaction не задана, то используется глобальная транзакция gdcBaseManager.ReadTransaction. Она всегда доступна и всегда открыта, если установлено подключение к базе данных.
При изменении данных порядок такой:
- Если задана и активна Transaction, то SQL запрос(ы) выполняются на ней. Её состояние не изменяется -- как была открыта, так и останется. Если логика бизнес-класса подразумевает сложные изменения данных через несколько SQL запросов, то внутренне используются SAVEPOINT-ы для того, чтобы гарантировать атомарность изменений не откатывая транзакцию в целом, в случае возникновения ошибки.
- Если Transaction не активна, то она стартует, выполняются изменения и транзакция завершается подтверждением (Commit) или откатывается (Rollback), если возникли ошибки.
- Если Transaction не задана, то создается своя, внутренняя транзакция и далее как в п. 2.
Если объекты связаны как master-detail, то детальный объект использует транзакции главного (master) объекта.
Использование транзакции бизнес-объекта во внешних запросах
Если необходимо выполнить SQL запрос в процессе выполнения методов DoAfterСustomProcess, CustomInsert, CustomModify и CustomDelete, то:
- Если надо только что-то прочитать за пределами процесса, то используем gdcBaseManager.ReadTransaction. Она всегда есть, она всегда открыта.
- Если Вам надо что-то изменить или прочитать данные, которые меняются текущим процессом, то используем Self.Transaction. Не надо проверять открыта она или нет. Она ДОЛЖНА быть открыта. Если нет, то это ошибка в коде ядра или в коде настройки и надо исправлять саму ошибку, а не проверять ее следствие.
В любом другом месте:
- Если Вам надо только что-то прочитать, то используем gdcBaseManager.ReadTransaction. Она всегда есть, она всегда открыта.
- Если Вам надо что-то изменить, то создаем и используем свою транзакцию. Ни в коем случае не дергаем Self.Transaction или gdcObject.Transaction. Одиночные изменения можно делать вызовом gdcBaseManager.ExecSingleQuery.