Les règles suivantes gouvernent la visibilité des modifications de données dans les fonctions qui utilisent SPI (ou tout autre fonction C) :
Pendant l'exécution de la commande SQL, toute modification de données faite par la commande est invisible à la commande. Par exemple, dans la commande :
INSERT INTO a SELECT * FROM a;
les lignes insérées sont invisibles à la partie SELECT
.
Les modifications effectuées par une commande C sont visibles par toutes les commandes qui sont lancées après C, peu importe qu'elles soient lancées à l'intérieur de C (pendant l'exécution de C) ou après que C soit terminée.
Les commandes exécutées via SPI à l'intérieur d'une fonction appelée par une commande SQL (soit une fonction ordinaire, soit un trigger) suivent une des règles ci-dessus suivant le commutateur lecture/écriture passé à SPI. Les commandes exécutées en mode lecture seule suivent la première règle : elles ne peuvent pas voir les modifications de la commande appelante. Les commandes exécutées en mode lecture/écriture suivent la deuxième règle : elles peuvent voir toutes les modifications réalisées jusqu'à maintenant.
Tous les langages standards de procédures initialisent le mode
lecture/écriture suivant l'attribut de volatilité de la fonction.
Les commandes des fonctions STABLE
et
IMMUTABLE
sont réalisées en mode lecture seule alors que
les fonctions VOLATILE
sont réalisées en mode
lecture/écriture. Alors que les auteurs de fonctions C sont capables
de violer cette convention, il est peu probable que cela soit une
bonne idée de le faire.
La section suivante contient un exemple qui illustre l'application de ces règles.