GdcBase.TgdcBase.Transaction

Материал из GedeminWiki
(Различия между версиями)
Перейти к: навигация, поиск
(Новая страница: «{{PropertyDef_Template|unit=gdcBase|class=TgdcBase|visibility=public|src=property Transaction: TIBTransaction read GetTransaction write SetTransaction;}} == Опи…»)
 
(Использование транзакции бизнес-объекта во внешних запросах)
 
(не показаны 4 промежуточные версии 1 участника)
Строка 1: Строка 1:
{{PropertyDef_Template|unit=gdcBase|class=TgdcBase|visibility=public|src=property Transaction: TIBTransaction read GetTransaction write SetTransaction;}}
+
{{PropertyDef_Template|unit={{#explode:{{PAGENAME}}|.|0}}|class={{#explode:{{#explode:{{PAGENAME}}| |0}}|.|1}}|visibility=public|src=property Transaction: TIBTransaction read GetTransaction write SetTransaction;}}
 
+
 
== Описание ==
 
== Описание ==
 +
<onlyinclude>Транзакция на которой происходит изменение данных.</onlyinclude>
  
<onlyinclude>
+
Бизнес-объект имеет два свойства, две транзакции: одна для чтения данных -- ReadTransaction, другая для изменения -- Transaction.
Транзакция.
+
 
</onlyinclude>
+
При чтении данных порядок такой:
 +
 
 +
# Если задана и активна 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. Она всегда есть, она всегда открыта.
+
# Если надо только что-то прочитать за пределами процесса, то используем gdcBaseManager.ReadTransaction. Она всегда есть, она всегда открыта.
 
# Если Вам надо что-то изменить или прочитать данные, которые меняются текущим процессом, то используем Self.Transaction. Не надо проверять открыта она или нет. Она ДОЛЖНА быть открыта. Если нет, то это ошибка в коде ядра или в коде настройки и надо исправлять саму ошибку, а не проверять ее следствие.
 
# Если Вам надо что-то изменить или прочитать данные, которые меняются текущим процессом, то используем Self.Transaction. Не надо проверять открыта она или нет. Она ДОЛЖНА быть открыта. Если нет, то это ошибка в коде ядра или в коде настройки и надо исправлять саму ошибку, а не проверять ее следствие.
  
==== Находимся за пределами процесса изменения ====
+
В любом другом месте:
 
+
# Если Вам надо только что-то прочитать, то используем gdcBaseManager.ReadTransaction. Она всегда есть, она всегда открыта.
+
# Если Вам надо что-то изменить, то создаем и используем свою транзакцию. Ни в коем случае не дергаем Self.Transaction или gdcObject.Transaction. Одиночные изменения можно делать gdcBaseManager.ExecSingleQuery.
+
  
Внутри процесса означает в методах DoAfterСustomProcess, CustomInsert, CustomModify и CustomDelete.
+
# Если Вам надо только что-то прочитать, то используем [[GdcBase.TgdcBaseManager.ReadTransaction|gdcBaseManager.ReadTransaction]]. Она всегда есть, она всегда открыта.
 +
# Если Вам надо что-то изменить, то создаем и используем свою транзакцию. Ни в коем случае не дергаем Self.Transaction или gdcObject.Transaction. Одиночные изменения можно делать вызовом gdcBaseManager.ExecSingleQuery.

Текущая версия на 08:30, 31 января 2016

 Модуль: 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.
Персональные инструменты
Пространства имён

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