FirebirdSQL logo
 Variables de contexteSécurité 

Mode de résolution de verrouillage

Lorsque plusieurs applications clientes travaillent avec la même base de données, des verrous peuvent apparaître. Un verrou peut se produire lorsqu’une transaction apporte des modifications non approuvées à une ligne de la table ou supprime une ligne, et qu’une autre transaction tente de modifier ou de supprimer la même ligne. De tels verrous sont appelés conflits de mise à jour.

Les blocages peuvent également se produire dans d’autres situations lors de l’utilisation de certains niveaux d’isolation des transactions.

Il existe deux modes de résolution du verrouillage : WAIT et NO WAIT.

Mode WAIT

En mode WAIT (le mode par défaut), s’il y a un conflit avec des transactions concurrentes exécutant des mises à jour de données concurrentes dans la même base de données, cette transaction attendra que la transaction concurrente se termine en la confirmant (COMMIT) ou en l’annulant (ROLLBACK). En d’autres termes, l’application du client sera mise en attente jusqu’à ce que le conflit soit résolu.

Si LOCK TIMEOUT est spécifié pour le mode WAIT, l’attente ne durera que le nombre de secondes spécifié dans cette phrase. Après ce délai, un message d’erreur sera généré : “Lock time-out on wait transaction”.

Ce mode donne des comportements légèrement différents selon le niveau d’isolation des transactions.

Dans l’API Firebird, le mode WAIT correspond à la constante isc_tpb_wait.

Mode NO WAIT

Si le mode NO WAIT est défini, cette transaction lèvera immédiatement une exception de base de données si un conflit de verrou se produit.

Dans l’API Firebird, le mode NO WAIT correspond à la constante isc_tpb_nowait.

Note

L’option LOCK TIMEOUT est une option de transaction séparée mais ne peut être utilisée que pour les transactions WAIT. Spécifier LOCK TIMEOUT avec une transaction NO WAIT provoquera une erreur “invalid parameter in transaction parameter block -Option isc_tpb_lock_timeout is not valid if isc_tpb_nowait was used previously in TPB”.

ISOLATION LEVEL

Le niveau d’isolement d’une transaction est une valeur qui détermine le niveau auquel une transaction est autorisée à avoir des données incohérentes, c’est-à-dire le degré d’isolement d’une transaction par rapport à une autre. Les modifications apportées par un opérateur seront visibles pour tous les opérateurs suivants s’exécutant dans la même transaction, quel que soit son niveau d’isolement. Les modifications apportées dans une autre transaction restent invisibles pour la transaction actuelle jusqu’à ce qu’elles soient confirmées. Le niveau d’isolement, et parfois d’autres attributs, déterminent comment une transaction est isolée.

La clause optionnelle ISOLATION LEVEL spécifie le niveau d’isolation de la transaction en cours d’exécution. C’est la caractéristique la plus importante d’une transaction et elle détermine son comportement par rapport aux autres transactions concurrentes.

Il existe trois niveaux d’isolation des transactions :

  • SNAPSHOT

  • SNAPSHOT TABLE STABILITY

  • READ COMMITTED révisé (NO RECORD_VERSION ou RECORD_VERSION ou READ CONSISTENCY)