FirebirdSQL logo
Уровень изолированности SNAPSHOT

Уровень изолированности SNAPSHOT (уровень изолированности по умолчанию) означает, что этой транзакции видны лишь те изменения, фиксация которых произошла не позднее момента старта этой транзакции.Любые подтверждённые изменения, сделанные другими конкурирующими транзакциями, не будут видны в такой транзакции в процессе ее активности без её перезапуска.Чтобы увидеть эти изменения, нужно завершить транзакцию (подтвердить её или выполнить полный откат, но не откат на точку сохранения) и запустить транзакцию заново.

Note

Изменения, вносимые автономными транзакциями, также не будут видны в контексте той (“внешней”) транзакции, которая запустила эти автономные транзакции, если она работает в режиме SNAPSHOT.

В Firebird API режиму изолированности SNAPSHOT соответствует константа isc_tpb_concurrency.

Предложение AT NUMBER

Транзакцию с уровнем изолированности SNAPSHOT можно запустить на основе другой транзакции, если известен номер её снимка.В этом случае эта новая транзакция может видеть те же самые данные, что и транзакция на основе которой она запущена.

Эта функциональность позволяет создать параллельные процессы (в разных подключениях), считывающие согласованные данные из базы данных.Например, процесс резервного копирования может создавать несколько потоков, параллельно считывающих данные из базы данных.Или веб-служба работать с распределёнными вспомогательными службами, выполняя некоторую обработку.

Это достигается созданием транзакции с использованием синтаксиса

SET TRANSACTION SNAPSHOT  AT NUMBER snapshot_number

или через API с использованием константы isc_tpb_at_snapshot_number.

Значение snapshot_number из первой транзакции можно получить используя следующий запрос

RDB$GET_CONTEXT('SYSTEM', 'SNAPSHOT_NUMBER')

или через API информации о транзакции с константой fb_info_tra_snapshot_number.

Note

Обратите внимание, snapshot_number должен быть номером снимка активной транзакции.