Вы можете использовать один TPB для всех транзакций, которым требуются одинаковые характеристики. Хорошим решением также является использование отдельного TPB для каждой транзакции. Классы транзакций обычно создают экземпляр TPB при необходимости, каждый экземпляр хранит установки интерфейса времени проектирования или времени выполнения в виде свойств, допускающих чтение и запись (или, иначе, элементы данных).
В большинстве случаев вы можете распознать константу TPB по имени свойства (табл. 27.1). В стандартных драйверах DBC имена классов и их элементов больше всего диктуются требованиями стандарта и описывают атрибуты с большим соответствием задаваемой функциональности.
Таблица 27.1. Атрибуты транзакции и эквивалентные константы TPB
Тип атрибута | Атрибут SQL | Константа TPB |
Режим доступа | READ ONLY | isc_tpb_read |
READ WRITE | isc_tpb_write | |
Уровень изоляции | READ COMMITTED | isc_tpb_read committed |
SNAPSHOT | isc_tpb_concurrency | |
SNAPSHOT TABLE STABILITY | isc_tpb_consistency | |
Режим разрешения блокировок | WAIT | isc_tpb_wait |
NO WAIT | isc_tpb_nowait | |
Версия записи | RECORD_VERSION | isc_rec version |
NO RECORD_VERSION | isc_no_rec_version | |
Резервирование таблиц | SHARED | isc_tpb_shared |
PROTECTED | isc_tpb_protected | |
READ | isc_tpb_lock_read | |
WRITE | isc_tpb_lock_write | |
Нет эквивалента SQL | Отключает протокол автоотмены | isc_tpb_no auto undo |
По умолчанию сервер поддерживает в памяти протокол внутренних точек сохранения (internal savepoint log) для добавляемых и изменяемых строк. При нормальном течении процесса записи протокола удаляются при каждом подтверждении или откате транзакции. Однако при некоторых условиях система отказывается от протокола и напрямую обращается к глобальному образу состояния транзакции (TSB). Такой переход обычно происходит, когда отменится очень большое количество добавлений или транзакция, использующая множество пользовательских точек сохранения (см. разд. "Вложенные транзакции"), исчерпает возможности этого протокола.
Приложение может отключить использование в транзакции этого протокола автоотмены, передав константу isc_tpb_no_auto_undo в TPB.
Доступ к идентификатору транзакции
Начиная с Firebird 1.5 идентификатор (TID) текущей транзакции (который получается из хранимых данных состояния транзакции) доступен в виде контекстной переменной. Он доступен в DSQL, isql, триггерах и хранимых процедурах. Это переменная CURRENT_TRANSACTION.
Например, для получения идентификатора в запросе вы можете выполнить следующее:
SELECT CURRENT_TRANSACTION AS TRAN_ID FROM RDВ$DATABASE;
Для сохранения его в таблице нужно выполнить:
INSERT INTO TASK_LOG (USER_NAME, TRAN_ID, START_TIMESTAMP)
VALUES (CURRENT_USER, CURRENT_TRANSACTION, CURRENT_TIMESTAMP) ;
! ! !
ВНИМАНИЕ! Идентификаторы транзакции не являются достаточно стабильными, чтобы их использовать в качестве ключей. Серия номеров для идентификаторов транзакций будет устанавливаться в 1 каждый раз при восстановлении базы данных.
. ! .
Firebird 1.0.x не предоставляет механизма отслеживания транзакций.
Использование TID в приложениях
Идентификатор транзакции на сервере не является тем же самым, что и дескриптор транзакции, который клиент Firebird получает в свое приложение. Довольно обоснованным является ассоциирование идентификатора транзакции с дескриптором транзакции при условии, что вы помните о необходимости изменить отношение между идентификатором и дескриптором транзакции при новой инициализации дескриптора. Каждое использование дескриптора в вашем приложении должно быть атомарным.
Идентификатор транзакции может быть полезным при отслеживании приложений и пользователей, ответственных за долгие транзакции в системе, ухудшающие ее производительность. Служебная программа циклического отслеживания может записывать на сервер время старта и завершения транзакций (подтверждение или отмена). В частности, отсутствие времени завершения будет полезным для отыскания пользователей, привычно использующих кнопку "восстановить" для завершения задач, или приложений, в которых регулярно происходит отказ при подтверждении работы.
Процесс выполнения транзакции