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!
la source
Réponses:
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:
Telles sont mes réflexions sur la question, ouvertes à entendre plus de la communauté.
la source
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.".
la source
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.
la source
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
la source
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:
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!
la source