Cet article est une traduction du glossaire de Jonathan Lewis publié sur son blog. L’article original en anglais se trouve ici.
SCN est l’abréviation de System Change Number ou de System Commit Number (aucun de ces 2 termes n’est vraiment exact)
Le SCN est utilisé comme une sorte d’horloge interne d’une instance Oracle. Mais il n’avance pas régulièrement. C’est un compteur qui est incrémenté à chaque fois qu’une session fait un commit (ou un rollback).
Il peut changer à d’autres occasions: les instances impliquées dans des transactions ou requêtes distribuées vont synchroniser leur SCN (toujours vers un valeur supérieure) à la fin de chaque dialogue. De la même manière, les instances d’une configuration RAC synchronisent leur SCN très fréquemment.
Il y a aussi une autre raison: chaque modification d’un bloc incrémente un ‘change number‘ dans ce bloc qui est composé du SCN courant et d’un compteur sur un octet. Donc s’il y a plus de 255 modifications dans un bloc dans une période où aucun commit ne se fait, alors le SCN va être incrémenté de 1 et ce compteur est remis à 1 (la valeur zéro étant réservée pour marquer un bloc comme corrompu – logically corrupt – ce qui se retrouve dans l’alert.log sous l’erreur ORA-01578).
Une session prend note du SCN courant à différents moments (le début d’une transaction, le commit d’une transaction, le début d’une requête) et le SCN courant est écrit dans la base à différents endroits (controlfiles, entêtes de datafiles, entête de bloc, entrées ITL).
Une session est constamment en train de comparer le SCN courant, ou un des SCN qu’elle a pre-enregistrés, avec les SCN stockés dans la base de données afin de vérifier qu’elle voit une version sûre, correcte et appropriée des données.
Vous pouvez connaître le SCN courant en appelant la fonction dbms_flashback.get_system_change_number ou en faisant select current_scn from v$database
. Par contre, chaque requête sur v$database incrémente le SCN, donc CURRENT_SCN sera incrémenté avant d’être affiché.