FirebirdSQL logo
Niveau d’isolation SNAPSHOT

Le niveau d’isolement SNAPSHOT (le niveau d’isolement par défaut) signifie que seules les modifications qui ont été validées au plus tard au moment où cette transaction a démarré sont visibles pour cette transaction. Les modifications confirmées par d’autres transactions concurrentes ne seront pas visibles dans cette transaction pendant son activité sans la relancer. Pour voir ces modifications, la transaction doit être fermée (confirmée ou annulée complètement mais pas annulée au point de sauvegarde) et la transaction doit être relancée.

Note

Les modifications apportées par les transactions autonomes ne seront pas non plus visibles dans le contexte de la transaction ("externe") qui a lancé ces transactions autonomes si elle s’exécute en mode SNAPSHOT.

Dans l’API Firebird, le mode d’isolation SNAPSHOT correspond à la constante isc_tpb_concurrency.

Utilisation de AT NUMBER

Une transaction avec un niveau d’isolation SNAPSHOT peut être exécutée sur la base d’une autre transaction, si son numéro d’instantané est connu. Dans ce cas, cette nouvelle transaction peut voir les mêmes données que la transaction sur laquelle elle est exécutée.

Cette fonctionnalité permet de créer des processus parallèles (dans différentes connexions) qui lisent des données cohérentes à partir de la base de données. Par exemple, un processus de sauvegarde pourrait créer plusieurs threads qui lisent des données à partir de la base de données en parallèle. Ou un service Web pourrait travailler avec des services auxiliaires distribués pour effectuer certains traitements.

Pour ce faire, il faut créer une transaction en utilisant la syntaxe suivante

SET TRANSACTION SNAPSHOT  AT NUMBER snapshot_number

ou via l’API en utilisant la constante isc_tpb_at_snapshot_number.

La valeur de snapshot_number de la première transaction peut être récupérée en utilisant la requête suivante

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

ou via l’API d’information sur les transactions avec la constante fb_info_tra_snapshot_number.

Note

Remarque : snapshot_number doit être le numéro de l’instantané de la transaction active.