44.5. Видимость изменений данных#
44.5. Видимость изменений данных
Следующие правила определяют видимость изменений данных в функциях, использующих SPI (или любую другую функцию на языке C):
Во время выполнения SQL-команды все изменения данных, сделанные этой командой, невидимы для самой команды. Например, в:
INSERT INTO a SELECT * FROM a;
вставленные строки невидимы для части
SELECT
.Изменения, внесенные командой C, видны всем командам, которые запущены после C, независимо от того, запущены ли они внутри C (во время выполнения C) или после завершения C.
Все команды, выполненные через SPI внутри функции, вызванной SQL-командой (обычной функцией или триггером), следуют одному из вышеуказанных правил в зависимости от флага чтения/записи, переданного в SPI. Команды, выполненные в режиме только чтения, следуют первому правилу: они не могут видеть изменения вызывающей команды. Команды, выполненные в режиме чтения/записи, следуют второму правилу: они могут видеть все изменения, сделанные до этого момента.
Все стандартные процедурные языки устанавливают режим чтения-записи SPI в зависимости от атрибута волатильности функции. Команды функций
STABLE
иIMMUTABLE
выполняются в режиме только чтения, в то время как команды функцийVOLATILE
выполняются в режиме чтения-записи. Хотя авторы функций на языке C могут нарушить эту конвенцию, маловероятно, что это будет хорошей идеей.
Следующий раздел содержит пример, иллюстрирующий применение этих правил.