GdcBase.TgdcBase.Transaction

Материал из GedeminWiki
Перейти к: навигация, поиск
 Модуль: GdcBase.pas   Тип: property   Видимость: public   Принадлежит: TgdcBase 

Delphi:

 property Transaction: TIBTransaction read GetTransaction write SetTransaction;

Описание

Транзакция на которой происходит изменение данных.

Бизнес-объект имеет два свойства, две транзакции: одна для чтения данных -- ReadTransaction, другая для изменения -- Transaction.

При чтении данных порядок такой:

  1. Если задана и активна Transaction, то используется она.
  2. Если задана ReadTransaction, то используется она (при необходимости открывается).
  3. Если ReadTransaction не задана, то используется глобальная транзакция gdcBaseManager.ReadTransaction. Она всегда доступна и всегда открыта, если установлено подключение к базе данных.

При изменении данных порядок такой:

  1. Если задана и активна Transaction, то SQL запрос(ы) выполняются на ней. Её состояние не изменяется -- как была открыта, так и останется. Если логика бизнес-класса подразумевает сложные изменения данных через несколько SQL запросов, то внутренне используются SAVEPOINT-ы для того, чтобы гарантировать атомарность изменений не откатывая транзакцию в целом, в случае возникновения ошибки.
  2. Если Transaction не активна, то она стартует, выполняются изменения и транзакция завершается подтверждением (Commit) или откатывается (Rollback), если возникли ошибки.
  3. Если Transaction не задана, то создается своя, внутренняя транзакция и далее как в п. 2.

Если объекты связаны как master-detail, то детальный объект использует транзакции главного (master) объекта.

Использование транзакции бизнес-объекта во внешних запросах

Если необходимо выполнить SQL запрос в процессе выполнения методов DoAfterСustomProcess, CustomInsert, CustomModify и CustomDelete, то:

  1. Если надо только что-то прочитать за пределами процесса, то используем gdcBaseManager.ReadTransaction. Она всегда есть, она всегда открыта.
  2. Если Вам надо что-то изменить или прочитать данные, которые меняются текущим процессом, то используем Self.Transaction. Не надо проверять открыта она или нет. Она ДОЛЖНА быть открыта. Если нет, то это ошибка в коде ядра или в коде настройки и надо исправлять саму ошибку, а не проверять ее следствие.

В любом другом месте:

  1. Если Вам надо только что-то прочитать, то используем gdcBaseManager.ReadTransaction. Она всегда есть, она всегда открыта.
  2. Если Вам надо что-то изменить, то создаем и используем свою транзакцию. Ни в коем случае не дергаем Self.Transaction или gdcObject.Transaction. Одиночные изменения можно делать вызовом gdcBaseManager.ExecSingleQuery.
Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты