Verrouillages et contrôle des accès concurrents

Pour fournir un contrôle des accès concurrents et empêcher un accès non contrôlé aux données, le gestionnaire de base de données place des verrous sur les pools de mémoire tampon, les tables, les partitions de données, les blocs de table ou les lignes de table.

Un verrou associe une ressource du gestionnaire de base de données à une application, appelée propriétaire du verrou, pour contrôler la façon dont les autres applications accèdent à la même ressource.

Le gestionnaire de base de données utilise le verrouillage de niveau ligne ou de niveau table, selon le cas, en fonction des éléments suivants:
  • Niveau d'isolement spécifié lors de la précompilation ou lorsqu'une application est liée à la base de données. Le niveau d'isolement peut être l'un des suivants:
    • Lecture non validée (LNV)
    • Lecture non reproductible (CS)
    • Stabilité de la lecture (SL)
    • Lecture reproductible (LR)
    Les différents niveaux d'isolement sont utilisés pour contrôler l'accès aux données non validées, empêcher les mises à jour perdues, autoriser les lectures de données non reproductibles et empêcher les lectures fantômes. Pour réduire l'impact sur les performances, utilisez le niveau d'isolement minimal qui répond aux besoins de votre application.
  • Plan d'accès sélectionné par l'optimiseur. Les analyses de table, les analyses d'index et les autres méthodes d'accès aux données requièrent chacune différents types d'accès aux données.
  • Attribut LOCKSIZE de la table. La clause LOCKSIZE de l'instruction ALTER TABLE indique la granularité des verrous utilisés lors de l'accès à la table. Les options sont les suivantes: ROW pour les verrous de ligne, TABLE pour les verrous de table ou BLOCKINSERT pour les verrous de bloc sur les tables MDC uniquement. Lorsque la clause BLOCKINSERT est utilisée sur une table MDC, le verrouillage au niveau de la ligne est effectué, sauf lors d'une opération d'insertion, lorsque le verrouillage au niveau du bloc est effectué à la place. Utilisez l'instruction ALTER TABLE ...Instruction LOCKSIZE BLOCKINSERT pour les tables MDC lorsque des transactions effectuent des insertions importantes dans des cellules disjointes. Utilisez l'instruction ALTER TABLE ...Instruction LOCKSIZE TABLE pour les tables en lecture seule. Cela réduit le nombre de verrous requis pour l'activité de la base de données. Pour les tables partitionnées, les verrous de table sont d'abord acquis, puis les verrous de partition de données sont acquis, en fonction des données qui seront accessibles.
  • Quantité de mémoire dédiée au verrouillage, qui est contrôlée par le paramètre de configuration de la base de données locklist . Si la liste des verrous est saturée, les performances peuvent être dégradées en raison des escalades de verrous et de la réduction des accès concurrents entre les objets partagés de la base de données. Si des escalades de verrous se produisent fréquemment, augmentez la valeur de locklist, maxlocksou les deux. Pour réduire le nombre de verrous maintenus en même temps, assurez-vous que les transactions sont fréquemment validées.

Un verrou de pool de mémoire tampon (exclusif) est défini chaque fois qu'un pool de mémoire tampon est créé, modifié ou supprimé. Vous pouvez rencontrer ce type de verrou lors de la collecte des données de surveillance du système. Le nom du verrou est l'identificateur (ID) du pool de mémoire tampon lui-même.

En général, le verrouillage au niveau de la ligne est utilisé sauf si l'une des conditions suivantes est vérifiée:
  • Le niveau d'isolement est une lecture non validée
  • Le niveau d'isolement est une lecture reproductible et le plan d'accès requiert une analyse sans prédicats de plage d'index
  • L'attribut LOCKSIZE de la table est TABLE
  • La liste des verrous se remplit, entraînant une escalade de verrous
  • Un verrou de table explicite a été acquis via l'instruction LOCK TABLE, qui empêche les processus d'application simultanés de changer ou d'utiliser une table
Dans le cas d'une table MDC, le verrouillage au niveau du bloc est utilisé à la place du verrouillage au niveau de la ligne lorsque:
  • L'attribut LOCKSIZE de la table est BLOCKINSERT
  • Le niveau d'isolement est une lecture reproductible et le plan d'accès implique des prédicats
  • Une opération de mise à jour ou de suppression recherchée implique des prédicats sur les colonnes de dimension uniquement
La durée du verrouillage de ligne varie en fonction du niveau d'isolement utilisé:
  • Analyses UR: aucun verrou de ligne n'est maintenu à moins que les données de ligne ne soient modifiées.
  • Analyses CS: les verrous de ligne sont généralement maintenus uniquement lorsque le curseur est positionné sur la ligne. Notez que dans certains cas, les verrous peuvent ne pas être maintenus du tout lors d'une analyse CS.
  • Analyses RS: les verrous de ligne de qualification ne sont maintenus que pendant la durée de la transaction.
  • Analyses RR: tous les verrous de ligne sont maintenus pendant la durée de la transaction.