Maison > Article > base de données > Quelle est la différence entre le verrouillage optimiste et le verrouillage pessimiste dans MySQL
Différence : le verrouillage pessimiste est une attitude pessimiste à l'égard du traitement des données et croit toujours que des conflits de concurrence se produiront lors de l'acquisition et de la modification des données. Par conséquent, les données doivent être verrouillées pendant tout le processus de traitement des données. Le verrouillage optimiste est optimiste quant au traitement des données et estime que les conflits ne se produiront généralement pas. Ce n'est que lorsque les mises à jour des données seront soumises que les conflits de données seront détectés.
L'environnement d'exploitation de ce tutoriel : système windows7, version mysql8, ordinateur Dell G3.
Le verrouillage pessimiste et le verrouillage optimiste sont des concepts définis par les gens. Vous pouvez les comprendre comme une idée et une méthode courante pour gérer les ressources simultanées.
Ne les confondez pas avec les mécanismes de verrouillage (verrous de table, verrous de ligne, verrous exclusifs, verrous partagés) fournis dans MySQL.
1. Verrouillage pessimiste
Comme son nom l'indique, il s'agit d'une attitude pessimiste à l'égard du traitement des données. Il croit toujours que des conflits de concurrence se produiront lorsque les données seront obtenues et modifiées. Par conséquent, les données doivent être verrouillées pendant tout le processus de traitement des données.
L'implémentation des verrous pessimistes repose généralement sur le mécanisme de verrouillage fourni par la base de données, tel que le verrou exclusif de MySQL, sélectionnez .... pour la mise à jour pour implémenter les verrous pessimistes.
Exemple : Lors de la vente flash du produit, la quantité en stock est réduite pour éviter les situations de survente.
CREATE TABLE `tb_goods_stock` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', `goods_id` bigint(20) unsigned DEFAULT '0' COMMENT '商品ID', `nums` int(11) unsigned DEFAULT '0' COMMENT '商品库存数量', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `modify_time` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `goods_id` (`goods_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品库存表';
Définissez le type de champ Numéros de quantité d'inventaire du produit sur non signé pour garantir qu'aucun nombre négatif n'apparaîtra au niveau de la base de données.
Notez que pour utiliser le verrouillage pessimiste, vous devez désactiver la fonction autocommit de mysql et définir autocommit = 0 ;
Notez que les verrous au niveau des lignes dans mysql sont basés sur des index. Si SQL n'utilise pas d'index, table-. des verrous de niveau seront utilisés. La table entière est verrouillée.
1. Ouvrez la transaction, interrogez les marchandises à vendre et verrouillez l'enregistrement.
begin;select nums from tb_goods_stock where goods_id = {$goods_id} for update;
2. Déterminez si la quantité du produit est supérieure à la quantité achetée. Si vous n'êtes pas satisfait, annulez la transaction.
3. Si les conditions sont remplies, réduisez l'inventaire et soumettez la transaction.
update tb_goods_stock set nums = nums - {$num} where goods_id = {$goods_id} and nums >= {$num}; commit;
Le verrou pendant la transaction sera libéré lorsque la transaction sera validée.
Le verrouillage pessimiste adopte une stratégie conservatrice consistant à verrouiller d'abord puis à traiter les données dans un contrôle de concurrence. Bien qu'il garantisse la sécurité du traitement des données, il réduit également l'efficacité.
2. Verrouillage optimiste
Comme son nom l'indique, il est optimiste quant au traitement des données. Il est optimiste que les données ne seront pas en conflit dans des circonstances normales. Ce n'est que lorsque les mises à jour des données seront soumises que le conflit de données sera détecté. .
Si un conflit est détecté, un message d'erreur sera renvoyé à l'utilisateur, lui permettant de décider comment opérer.
La mise en œuvre du verrouillage optimiste ne repose pas sur le mécanisme de verrouillage fourni par la base de données. Nous devons l'implémenter nous-mêmes. La méthode de mise en œuvre consiste généralement à enregistrer la version des données, l'une via le numéro de version et l'autre via le numéro de version. horodatage.
Ajoutez un champ de numéro de version ou d'horodatage au tableau. Lors de la lecture des données, lisez le numéro de version ensemble. Lorsque les données sont mises à jour, ajoutez 1 au numéro de version.
Lorsque nous soumettons la mise à jour des données, nous déterminons si le numéro de version actuel est égal au numéro de version lu en premier. S'ils sont égaux, mettez-les à jour. Dans le cas contraire, les données seront considérées comme expirées, la mise à jour sera rejetée et l'utilisateur sera invité à réopérer.
CREATE TABLE `tb_goods_stock` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', `goods_id` bigint(20) unsigned DEFAULT '0' COMMENT '商品ID', `nums` int(11) unsigned DEFAULT '0' COMMENT '商品库存数量', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `modify_time` datetime DEFAULT NULL COMMENT '更新时间', `version` bigint(20) unsigned DEFAULT '0' COMMENT '版本号', PRIMARY KEY (`id`), UNIQUE KEY `goods_id` (`goods_id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='商品库存表';
1. Vérifiez le produit à vendre et obtenez le numéro de version.
begin;select nums, version from tb_goods_stock where goods_id = {$goods_id};
2. Déterminez si la quantité du produit est supérieure à la quantité achetée. Si vous n'êtes pas satisfait, annulez la transaction.
3. Si les conditions sont remplies, réduisez les stocks. (Lors de la mise à jour, déterminez si la version actuelle est la même que la version obtenue à l'étape 1)
update tb_goods_stock set nums = nums - {$num}, version = version + 1 where goods_id = {$goods_id} and version = {$version} and nums >= {$num};
4. Déterminez si l'opération de mise à jour est exécutée avec succès, soumettez-la, sinon annulez.
Le verrouillage optimiste est basé sur la mise en œuvre du programme, il n'y a donc pas de blocage et convient aux scénarios d'application avec de nombreuses lectures. Si des conflits surviennent souvent, l'application de couche supérieure continuera de nécessiter une nouvelle opération des utilisateurs, ce qui réduira en fait les performances. Dans ce cas, le verrouillage pessimiste est plus approprié.
(Tutoriel recommandé : Tutoriel vidéo mysql)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!