Mécanisme de verrouillage Oracle – Loquets et files d’attente

X

Confidentialité & Cookies

Ce site utilise des cookies. En continuant, vous acceptez leur utilisation. En savoir plus, y compris comment contrôler les cookies.

Compris!

Annonces

Cet article fait partie de la série Oracle Performance Tuning et est créé pour décrire le mécanisme de verrouillage d’Oracle.

Un verrou est une ressource que vous devez conserver pour accéder à la ressource. Oracle a deux types de verrous: les files d’attente et les verrous, nous nous concentrerions maintenant sur ces mécanismes de verrouillage individuellement.

Files d’attente

Les files d’attente sont des verrous sophistiqués pour gérer l’accès aux ressources partagées (comme les tables, les lignes, les tâches, les threads de restauration). Une file d’attente peut être demandée dans différents niveaux / modes:

  • Null
  • Row share
  • Row exclusive
  • Share
  • Share row exclusive
  • Exclusive

Si une session contient une file d’attente en mode partage, les autres sessions peuvent alors également prendre le mise en file d’attente en mode partage (pour la même ressource). Si une session tient une file d’attente en mode exclusif, les autres sessions qui veulent l’obtenir – indépendamment de quel niveau – doivent attendre.

Lorsque l’accès est requis par une session, une structure de verrouillage est obtenue et une demande d’accès à la ressource à un niveau (mode) spécifique est faite. La structure de verrouillage est placée sur l’une des trois listes chaînées qui se trouvent hors de la ressource, appelées listes OWNER (si la file d’attente peut être acquise), WAITER (si la session attend d’acquérir la file d’attente) et CONVERTER (la session tient la file d’attente dans un niveau mais veut la convertir en une autre).

Voici quelques types courants de files d’attente:-

  • TM – Chaque fois qu’une session veut verrouiller une table, une file d’attente TM est demandée. Si une session supprime une ligne dans la table parent et qu’une contrainte référentielle (clé étrangère) est créée sans index sur la table enfant, ou si la session met à jour la ou les colonnes auxquelles la clé étrangère fait référence, un verrou de partage est pris sur la table enfant. Si une autre session essaie de modifier la table enfant, elle doit attendre (car elle veut que la file d’attente soit en mode exclusif de ligne, ce qui n’est pas compatible avec le mode de partage).
  • TX – Dès qu’une transaction est démarrée, une file d’attente TX est nécessaire. Une transaction est définie de manière unique par le numéro de segment de restauration, le numéro d’emplacement dans la table de transaction du segment de restauration et le numéro de séquence du numéro d’emplacement. Une session peut être en attente sur une file d’attente TX pour plusieurs raisons :
    1. Une autre session verrouille la ligne demandée
    2. Lorsque deux sessions essaient d’insérer la même clé unique dans une table (aucune d’entre elles n’a effectué de VALIDATION), alors la dernière session attend que la première soit VALIDÉE ou ANNULÉE.
    3. Il n’y a pas d’ITL libre (Liste de transactions intéressées) dans l’en-tête du bloc.
  • La session UL–A a pris un verrou avec le DBMS_LOCK.Fonction de DEMANDE.

Loquets

Les loquets fournissent un mécanisme de sérialisation de bas niveau protégeant les structures de données partagées dans le SGA. Un verrou est un type de verrou qui peut être très rapidement acquis et libéré. Les verrous sont généralement utilisés pour empêcher plus d’un processus d’exécuter le même morceau de code à un moment donné. Lorsqu’un verrou est acquis, il est acquis à un niveau particulier afin d’éviter les blocages. Une fois qu’un processus acquiert un verrou à un certain niveau, il ne peut plus acquérir ensuite un verrou à un niveau égal ou inférieur à ce niveau (à moins qu’il ne l’acquiert maintenant). Chaque verrou est associé à une procédure de nettoyage qui sera appelée si un processus meurt en maintenant le verrou. Ce nettoyage est effectué en utilisant les services de PMON. L’implémentation sous-jacente des verrous dépend du système d’exploitation, en particulier en ce qui concerne si un processus attendra un verrou et pendant combien de temps.

L’objectif des loquets est de gérer l’accès simultané aux structures de données partagées de telle sorte qu’un seul processus puisse accéder à la structure à la fois. Les processus bloqués (processus en attente d’exécuter une partie du code pour laquelle un verrou a déjà été obtenu par un autre processus) attendront que le verrou soit relâché. Oracle utilise des instructions atomiques telles que « test and set » pour fonctionner sur des verrous. Étant donné que les instructions pour définir et libérer les verrous sont atomiques, le système d’exploitation garantit qu’un seul processus l’obtient et qu’il ne s’agit que d’une seule instruction, c’est assez rapide.

Les requêtes de verrouillage peuvent être effectuées en deux modes:

  • prêt à attendre: Une requête en mode « prêt à attendre » boucle, attend et demande à nouveau jusqu’à ce que le verrou soit obtenu.
  • pas d’attente: En mode « pas d’attente », le processus demandera le verrou et s’il n’est pas disponible, au lieu d’attendre, un autre est demandé. Ce n’est que lorsque tout échoue que le processus du serveur doit attendre.

Différence entre les verrous & Files d’attente

Une différence entre un verrou et une file d’attente est que la file d’attente est obtenue à l’aide d’un mécanisme de verrouillage spécifique au système d’exploitation alors qu’un verrou est obtenu indépendamment du système d’exploitation. Une file d’attente permet à l’utilisateur de stocker une valeur dans le verrou (c’est-à-dire le mode dans lequel nous la demandons). Le gestionnaire de verrouillage du système d’exploitation garde une trace des ressources verrouillées. Si un processus ne peut pas être accordé au verrou car il est incompatible avec le mode demandé et que le verrou est demandé avec wait, le système d’exploitation place le processus demandeur dans une file d’attente qui est entretenue dans FIFO.

Une autre différence entre les loquets et les files d’attente est que les files d’attente maintiennent et ordonnent la file d’attente des serveurs alors que les loquets ne le font pas. Tous les processus en attente d’un loquet réessayent simultanément (en fonction du planificateur). Cela signifie que n’importe lequel des serveurs pourrait obtenir le loquet et que le premier à tenter d’obtenir le loquet pourrait être le dernier à l’obtenir. Les serveurs de latch peuvent soit utiliser des minuteries pour se réveiller et réessayer, soit tourner (uniquement dans les multiprocesseurs) tourner sur un latch signifie tenir le processeur et attendre en prévision de la libération de ce latch dans un court laps de temps).

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.