READ CONSISTENCY
Если указана эта опция, то транзакция с режимом изолированности READ COMMITED
делает стабильный снимок базы данных на время выполнения оператора.Каждый новый оператор верхнего уровня создаёт собственный моментальный снимок базы данных, чтобы видеть последние подтверждённые данные.Вложенные операторы (триггеры, вложенные хранимые процедуры и функции, динамические операторы и т.д.) используют тот же самый моментальный снимок базы данных, созданный оператором верхнего уровня.Таким образом обеспечивается согласованное чтение на момент начала выполнения оператора верхнего уровня.В Firebird 4.0 этот режим используется по умолчанию для транзакций с режимом изолированности READ COMMITED
.
В Firebird API для стабильного снимка на уровне SQL оператора READ CONSISTENCY
соответствует константа isc_tpb_read_consistency
.
Обработка конфликта обновлений
Когда оператор выполняется в транзакции с режимом изолированности READ COMMITTED READ CONSISTENCY
вид базы данных неизменен (подобно транзакции SNAPSHOT
). Поэтому бесполезно ждать фиксации параллельной транзакции в надежде перечитать новую версию зафиксированной записи.При чтении поведение похоже на транзакцию READ COMMITTED RECORD_VERSION
— оператор не ждёт завершения активной транзакции и обходит цепочку бекверсий, в которой ищет версию записи видимую для текущего моментального снимка.
Для режима изолированности READ COMMITTED READ CONSISTENCY
обработка конфликтов обновлений Firebird значительно изменяется.При обнаружении конфликта обновления выполняется следующее:
-
режим изолированности транзакции временно переключается в режим
READ COMMITTED NO RECORD VERSION
; -
Firebird устанавливает блокировку записи на конфликтную запись;
-
Firebird продолжает оценивать оставшиеся записи для удаления/обновления в курсоре, а также продолжает ставить на них блокировки;
-
когда больше нет записей для извлечения, запускается механизм для отмены всех выполненных действий, выполненных оператором верхнего уровня, и сохраняются все установленные блокировки для каждой обновлённой/удалённой/заблокированной записи, все вставленные записи удаляются;
-
затем Firebird восстанавливает режим изолированности транзакции как
READ COMMITTED READ CONSISTENCY
, создаёт новый снимок уровня оператора и перезапускает выполнение оператора верхнего уровня.
Такой алгоритм позволяет гарантировать, что после перезапуска уже обновлённые записи останутся заблокированными, они будут видны новому снимку и могут быть обновлены снова без дальнейших конфликтов.Кроме того, из-за режима согласованности чтения набор изменённых записей остаётся согласованным.
Note
|
Замечания
|