Pourquoi le verrouillage optimiste est-il plus rapide que le verrouillage pessimiste?


9

Les deux formes de verrouillage obligent un processus à attendre une copie correcte de l'enregistrement s'il est actuellement utilisé par un autre processus. Avec le verrouillage pessimiste, le mécanisme de verrouillage provient de la base de données elle-même (un objet de verrouillage natif), tandis qu'avec le verrouillage optimiste, le mécanisme de verrouillage est une forme de version de ligne comme un horodatage pour vérifier si un enregistrement est "périmé" ou non.

Mais les deux provoquent le blocage d'un 2e processus. Je demande donc: pourquoi le verrouillage optimiste est-il généralement considéré comme plus rapide / supérieur au verrouillage pessimiste? Et, y a-t-il des cas d'utilisation où le pessimiste est préféré à l'optimiste? Merci d'avance!


5
Une explication très courte existe dans la dénomination. Le verrouillage optimiste fonctionne bien lorsque les risques de verrouillage conflictuel sont faibles. Nous sommes optimistes quant à l'interaction de plusieurs processus. Le verrouillage pessimiste fonctionne bien lorsque le risque de verrouillage conflictuel est élevé. Nous sommes pessimistes quant à l'interaction de plusieurs processus. Les deux fonctionneront de manière sous-optimale là où leur contraire serait plus approprié.
Mark Storey-Smith

le verrouillage optimiste peut être plus rapide ou non que le verrouillage pessimiste, selon votre charge de travail.
AK

Réponses:


8

Question en double de:

/programming/129329/optimistic-vs-pessimistic-locking

Copiez / collez la réponse à partir du lien ci-dessus:

Le verrouillage optimiste est une stratégie dans laquelle vous lisez un enregistrement, notez un numéro de version et vérifiez que la version n'a pas changé avant de réécrire l'enregistrement. Lorsque vous réécrivez l'enregistrement, vous filtrez la mise à jour sur la version pour vous assurer qu'elle est atomique. (c.-à-d. n'a pas été mis à jour entre le moment où vous vérifiez la version et l'écriture de l'enregistrement sur le disque) et mettez à jour la version en une seule fois.

Si l'enregistrement est sale (c'est-à-dire une version différente de la vôtre), vous abandonnez la transaction et l'utilisateur peut la redémarrer.

Cette stratégie est plus applicable aux systèmes à volume élevé et aux architectures à trois niveaux où vous ne maintenez pas nécessairement une connexion à la base de données pour votre session. Dans cette situation, le client ne peut pas réellement maintenir les verrous de base de données car les connexions sont prises à partir d'un pool et vous n'utilisez peut-être pas la même connexion d'un accès à l'autre.

Le verrouillage pessimiste consiste à verrouiller l'enregistrement pour votre usage exclusif jusqu'à ce que vous en ayez fini avec lui. Il a une bien meilleure intégrité qu'un verrouillage optimiste mais vous oblige à être prudent avec la conception de votre application pour éviter les blocages. Pour utiliser le verrouillage pessimiste, vous avez besoin d'une connexion directe à la base de données (comme ce serait généralement le cas dans une application serveur client à deux niveaux) ou d'un ID de transaction disponible en externe qui peut être utilisé indépendamment de la connexion.

Dans ce dernier cas, vous ouvrez la transaction avec le TxID, puis vous reconnectez à l'aide de cet ID. Le SGBD maintient les verrous et vous permet de récupérer la session via le TxID. C'est ainsi que fonctionnent les transactions distribuées utilisant des protocoles de validation en deux phases (telles que les transactions XA ou COM +).

Modifier (en ajoutant plus d'informations pour répondre à la question des performances):

En termes de performances, cela dépend de votre environnement. Prenez en compte les facteurs suivants pour décider:

vous trouverez optimiste sera meilleur en raison de la simultanéité dans la plupart des situations. Selon le SGBDR et l'environnement, cela peut cependant être moins ou plus performant. En règle générale, avec le verrouillage optimiste, vous constaterez que la valeur doit être versionnée en ligne quelque part.

Avec MS SQL Server par exemple, il est déplacé vers TempDB et quelque chose entre 12-14 octets est ajouté à la fin de la colonne. L'activation du verrouillage optimiste avec un niveau d'isolement tel que l'isolement de capture instantanée peut provoquer une fragmentation et votre facteur de remplissage devra être ajusté car les lignes contiennent maintenant des données supplémentaires à la fin, ce qui pourrait entraîner une page presque pleine à provoquer un fractionnement de page, ce qui réduira vos performances. Si votre TempDB est sous-optimisé, ce ne sera pas aussi rapide.

Je suppose donc qu'une liste de contrôle est:

  • -Avez-vous suffisamment d'E / S / ressources pour gérer la forme de versionnage des lignes? Sinon, vous ajoutez des frais généraux. Si c'est le cas, alors si vous lisez souvent les données pendant que vous les verrouillez souvent pour les écritures, vous remarquerez une bonne amélioration de la concurrence entre les lectures et les écritures (bien que les écritures bloquent toujours les écritures, les lectures ne bloquent plus les écritures et vice versa)
  • -Votre code est-il sensible aux blocages ou rencontrez-vous un verrouillage? Si vous ne rencontrez pas de longs verrous ou de nombreux blocages, le surcoût supplémentaire du verrouillage optimiste ne rendrait pas les choses plus rapides, bien sûr, dans la plupart des cas, nous parlons de millisecondes ici.
  • -Si votre base de données est volumineuse (ou sur un matériel très limité) et que vos pages de données sont presque pleines, selon le SGBDR, vous pouvez provoquer des fractionnements de page importants et une fragmentation des données, alors assurez-vous de considérer la réindexation après l'avoir allumée.

Telles sont mes réflexions sur la question, ouvertes à entendre plus de la communauté.


Merci @Ali Razeghi (+1) - Je pense que dba.se est un endroit plus approprié pour cette question. Aussi, bien que ce soit une superbe réponse, elle ne répond pas à ma question de performance (quand l'un est plus rapide que l'autre). Merci encore!
Mara

Salut Mara, c'est un bon point. J'ai élargi la réponse. Merci.
Ali Razeghi

11

Vous comprenez mal le verrouillage optimiste.

Le verrouillage optimiste ne fait pas attendre les transactions.

Le verrouillage optimiste peut entraîner l'échec d'une transaction, mais il le fait sans qu'aucun "verrou" n'ait été pris. Et si une transaction échoue en raison d'un verrouillage optimiste, l'utilisateur est tenu de tout recommencer. Le mot "optimiste" découle exactement de l'attente selon laquelle la condition qui entraîne l'échec des transactions pour cette raison même ne se produira que très exceptionnellement. Le verrouillage "optimiste" est l'approche qui dit "Je ne prendrai pas les verrous réels parce que j'espère qu'ils ne seront pas nécessaires de toute façon. S'il s'avère que j'avais tort à ce sujet, j'accepterai l'échec inévitable.".


1

Le verrouillage optimiste est généralement plus rapide car il n'y a en fait aucun verrouillage du point de vue de la base de données. Il appartient entièrement à l'application de respecter ou non la colonne de version (ou la pseudo-colonne, comme ora_rowscn). Normalement, vous avez de nombreuses applications connectées à la même base de données, donc db devient une ressource partagée, et s'il se bloque, tous les clients seront affectés.

Avec une stratégie de verrouillage optimiste, le «blocage» se produit côté client et n'affecte pas les autres.

Cependant, si un enregistrement est mis à jour fréquemment, vous risquez de le relire trop souvent (en cas de verrouillage optimiste), ce qui annule les avantages de la stratégie optimiste.

Je ne suis pas d'accord sur la supériorité de l'une ou l'autre approche; les deux peuvent être mal utilisés. Le pessimisme est plus sujet aux erreurs simplement parce qu'il est plus dangereux: le verrouillage se produit au niveau de la base de données, dépend du RDMS, vous ne pouvez pas contrôler ce qui est verrouillé (escalade de verrouillage), vous devez prendre soin de l'ordre de verrouillage manuellement.


point intéressant a1ex07, le verrouillage optimsitic inclut toujours le verrouillage cependant, car les écritures bloqueront toujours les autres écritures, n'est-ce pas?
Ali Razeghi

Non, ce n'est pas le cas. C'est pourquoi c'est "plus rapide".
Erwin Smout

Cela pourrait être le cas pour Oracle mais pour MS SQL Server, car il utilise le niveau d'isolement `` lecture validée '' par défaut, le verrouillage optimiste permettra aux lecteurs et aux threads d'écriture de fonctionner simultanément, mais les écritures bloqueront les écritures jusqu'à ce que le thread de blocage se valide.
Ali Razeghi

@Ali Razeghi: Je ne suis pas sûr de suivre votre argument. Dans SQLServer avec des rédacteurs validés en lecture, bloquez les lecteurs par défaut, sauf si `READ_COMMITTED_SNAPSHOT` est activé. Le verrouillage optimiste n'est pas un verrou sur la ressource db (ligne / page / table), mais plutôt une sorte d'accord entre toutes les applications qui utilisent la base de données pour ne pas mettre à jour l'enregistrement si la version ne correspond pas à celle attendue.
a1ex07

1
@Eamon Nerbonne: J'ai dit à propos des 'écrivains ne bloquent pas les lecteurs' ... Où avez-vous vu que je mentionne quelque chose à propos des "écrivains bloquent / ne bloquent pas les écrivains"?
a1ex07

0

Le verrouillage optimiste suppose que les transactions simultanées peuvent se terminer sans s’affecter. Le verrouillage optimiste est donc plus rapide car aucun verrou n'est appliqué lors des transactions. C'est la prévention de causer des problèmes d'accès simultané qui ne guérit pas. La transaction vérifie simplement (trois façons les ensembles de données, le type de données d'horodatage, la vérification de la valeur ancienne et nouvelle) les données qu'aucune autre transaction n'a modifié les données. En cas de modification, la transaction est annulée.

Le verrouillage pessimiste suppose que les transactions simultanées entreront en conflit les unes avec les autres, il nécessite donc un verrouillage, il est effectué en spécifiant le niveau d'ISOLATION (lecture non validée, lecture validée, lecture répétable et sérialisable) de la gestion des transactions. les verrous servent à protéger les ressources ou les objets partagés (tables, lignes de données, blocs de données, éléments mis en cache, connexions et systèmes entiers). Nous avons de nombreux types de verrous comme verrous partagés, verrous de mise à jour, verrous d'encart, verrous exclusifs, verrous de transaction, verrous DML, verrous de schéma et verrous de sauvegarde-récupération.

pour avoir plus d'idée


-3

Il est faux de dire que le verrouillage pessimiste est plus lent qu'optimiste ou de dire qu'optimiste est plus rapide. Une requête classique pour démontrer cette façon de penser inappropriée est de faire un agrégat sur les différents SGBDR, comme:

SELECT COUNT(*) FROM atable

Vous verrez que, dans le SGBDR qui prend en charge l'approche nativement optimiste, le temps nécessaire à cette requête est beaucoup plus important que ceux qui ont un verrou nativement pessimiste

Par exemple sur mon PC, la même requête prend 27 ms sur SQL Server et 109 sur PostGreSQL ...

La surcharge supplémentaire nécessaire à la lecture des versions mortes des lignes MVCC et ne compte pas les enregistrements fantômes dans l'ensemble agrège les coûts supplémentaires que le pessimiste n'a pas!


4
L'approche de contrôle de concurrence de SGBD est orthogonale au verrouillage optimiste / pessimiste, et la comparaison des temps d'exécution des requêtes dans deux SGBD différents est trompeuse.
mustaccio

parce que SQL Server est capable de faire les deux modes de verrouillage, vous pouvez facilement comparer cela en faisant un véritable bécnhmark dans une approche de simultanéité utilisateur.
user7370003
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.