45.5. Видимость изменений данных#

45.5. Видимость изменений данных

45.5. Видимость изменений данных

Следующие правила определяют видимость изменений данных в функциях, использующих SPI (или любую другую функцию на языке C):

  • Во время выполнения SQL-команды все изменения данных, сделанные этой командой, невидимы для самой команды. Например, в:

    INSERT INTO a SELECT * FROM a;
    

    вставленные строки невидимы для части SELECT.

  • Изменения, внесенные командой C, видны всем командам, которые запущены после C, независимо от того, запущены ли они внутри C (во время выполнения C) или после завершения C.

  • Все команды, выполненные через SPI внутри функции, вызванной SQL-командой (обычной функцией или триггером), следуют одному из вышеуказанных правил в зависимости от флага чтения/записи, переданного в SPI. Команды, выполненные в режиме только чтения, следуют первому правилу: они не могут видеть изменения вызывающей команды. Команды, выполненные в режиме чтения/записи, следуют второму правилу: они могут видеть все изменения, сделанные до этого момента.

  • Все стандартные процедурные языки устанавливают режим чтения-записи SPI в зависимости от атрибута волатильности функции. Команды функций STABLE и IMMUTABLE выполняются в режиме только чтения, в то время как команды функций VOLATILE выполняются в режиме чтения-записи. Хотя авторы функций на языке C могут нарушить эту конвенцию, маловероятно, что это будет хорошей идеей.

Следующий раздел содержит пример, иллюстрирующий применение этих правил.