web-dev-qa-db-fra.com

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

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 2ème 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!

9
Mara

Question en double de:

https://stackoverflow.com/questions/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'est-à-dire qu'il 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 ne pouvez pas utiliser 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 (Ajout d'informations supplémentaires 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 concurrence dans la plupart des situations. En fonction du SGBDR et de l'environnement, cela peut cependant être moins ou plus performant. Généralement, 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 ont 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.

Donc je suppose 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, la surcharge 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é.

8
Ali Razeghi

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 jamais é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.".

11
Erwin Smout

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. C'est 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 du 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.

1
a1ex07

Le verrouillage optimiste suppose que les transactions simultanées peuvent se terminer sans affecter les uns les autres. 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. Lecture et sérialisable) de la gestion des transactions. Il guérit les problèmes de concurrence en acquérant un verrou. 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

0
Premraj