Le plus haut niveau
Les systèmes de gestion de bases de données relationnelles sont connus pour leurs propriétés ACID. Le I signifie ISOLATION. De multiples transactions peuvent être gérées simultanément par un SGBDR. Le standard SQL définit plusieurs niveaux disolation fixant les règles régissant la concurrence entre ces transactions. Dans cet article nous allons nous intéresser au niveau le plus élevé, le SERIALIZABLE. Ce niveau nautorise ni les lectures sales (dirty reads), ni les lectures non reproductibles (nonrepeatable read), ni les lectures fantômes (phantom reads), ni les anomalies de sérialisation (serialization anomaly). Cela signifie que les transactions sexécutant en concurrence doivent pouvoir être exécutées séquentiellement et donner strictement les mêmes résultats.
Nous avons vu dans cet article que les anomalies de sérialisation étaient les seules anomalies résiduelles au niveau disolation REPEATABLE READ avec PostgreSQL. Le niveau SERIALIZABLE permet-il de les éliminer ? Démonstration avec PostgreSQL 9.6 :
Il serait impossible dexécuter séquentiellement les transactions des sessions 1 et 2. La transaction de la session 1 modifie la ligne lue dans la session 2 et la transaction de la session 2 modifie la ligne lue dans la session 1. Cette anomalie a été détectée et remontée alors que ce nétait pas le cas au niveau REPEATABLE READ. Ce comportement est valable depuis la version 9.1. PostgreSQL respecte donc le standard SQL en ce qui concerne les niveaux disolation dans toutes ses version supportées. Dans les version 9.0 et inférieures, le niveau SERIALIZABLE était identique à lactuel niveau REPEATABLE READ. Attention donc si vous passez dune version 9.0 ou inférieure à une version 9.1 ou supérieure.
Nous avions laissé Oracle au niveau READ COMMITTED et nous passons directement au niveau SERIALIZABLE puisque le niveau REPEATABLE READ nest pas proposé par ce SGBD. En théorie, aucune anomalie nest admise à ce niveau. Nous allons commencer par les lectures non reproductibles et les lectures fantômes, démonstration avec Oracle Database 11.2.0.2 :
Comme prévu, les lectures non reproductibles comme les lectures fantômes sont éliminées au niveau SERIALIZABLE avec Oracle. Mais quen est-il des anomalies de sérialisation ? Démonstration avec Oracle Database 11.2.0.2 :
Une erreur ORA-08177 a été obtenue. Cependant, Tom Kyte présente dans cet article que cette erreur est juste la conséquence du fait quOracle Database travaille au niveau bloc et non au niveau ligne en ce qui concerne le niveau disolation SERIALIZABLE. Les 2 lignes mises à jour dans la démonstration devaient donc être situées dans le même bloc. Réalisons la même démonsration avec des lignes situées dans des blocs différents, toujours avec Oracle Database 11.2.0.2 :
Cette fois pas derreur, les lignes modifiées par chacune des transactions nappartenaient pas au même bloc. Oracle Database ne cherche PAS à remonter les anomalies de sérialisation et lORA-08177 nest PAS obtenue systématiquement. Cette implémentation relève de la cuisine interne dOracle mais ce quil faut retenir est que le niveau SERIALIZABLE de ce SGBD correspond conceptuellement au niveau REPEABLE READ du standard SQL avec en plus lélimination des lectures fantômes. En pratique, en dehors de ces ORA-08177, le niveau SERIALIZABLE dOracle correspond donc au niveau REPEATABLE READ des versions 9.1 et supérieures de PostgreSQL.