Maison  >  Article  >  base de données  >  Introduction au verrouillage optimiste et au verrouillage pessimiste dans MySQL (exemple de code)

Introduction au verrouillage optimiste et au verrouillage pessimiste dans MySQL (exemple de code)

不言
不言avant
2019-02-01 10:13:553716parcourir

Cet article vous présente une introduction au verrouillage optimiste et au verrouillage pessimiste dans MySQL (exemples de code). Les amis dans le besoin peuvent s'y référer. J'espère que cela vous aidera.

  • La tâche du contrôle de concurrence dans le système de gestion de base de données est de garantir que l'accès simultané aux mêmes données dans la base de données par plusieurs transactions ne détruit pas l'isolement et l'unité de la transaction et de la unité de la base de données

  • Les principaux moyens techniques utilisés dans le contrôle de la concurrence du verrouillage optimiste et du verrouillage pessimiste

Verrouillage pessimiste

  • Dans les systèmes de gestion de bases de données relationnelles, le contrôle de concurrence pessimiste (verrouillage pessimiste, PCC) est une méthode de contrôle de concurrence. Cela empêche une transaction de modifier les données d'une manière qui affecterait d'autres utilisateurs. Si un verrou est appliqué à chaque ligne de données pour l'opération effectuée par une transaction, uniquement lorsque le verrou de transaction est libéré, d'autres transactions peuvent effectuer des opérations qui entrent en conflit avec le verrou

  • Le contrôle de concurrence pessimiste est principalement utilisé dans les environnements où les conflits de données sont intenses et dans les environnements où le coût de l'utilisation de verrous pour protéger les données lorsque des conflits de concurrence se produisent est inférieur au coût de l'annulation des transactions

Le verrouillage pessimiste fait référence à une attitude conservatrice (pessimisme) à l'égard des données modifiées par le monde extérieur (y compris d'autres transactions actuelles du système et le traitement des transactions provenant de systèmes externes), de sorte que les données sont verrouillées pendant toutes les vacances d'été. traitement. La mise en œuvre du verrouillage pessimiste repose généralement sur le mécanisme de verrouillage fourni par la base de données (Tutoriel recommandé : Tutoriel MySQL)

  • Dans la base de données, le processus de verrouillage pessimiste est comme suit

    • Avant de modifier un enregistrement, essayez d'ajouter un verrou exclusif à l'enregistrement

    • Si le verrouillage échoue, cela signifie que l'enregistrement est en cours de modification, alors la requête en cours devra peut-être attendre ou lever une exception

    • Si le verrouillage réussit, l'enregistrement peut être modifié et il sera déverrouillé après la transaction est terminée

    • S'il existe d'autres opérations pour modifier l'enregistrement ou ajouter un verrou exclusif, elles attendront que nous déverrouillions ou lancerons directement une exception

Le verrouillage pessimiste est utilisé dans MySQL InnoDB

Pour utiliser le verrouillage pessimiste, l'attribut de validation automatique de la base de données mysql doit être désactivé, car MySQL utilise le mode de validation automatique par défaut , c'est-à-dire que lorsque vous effectuez une opération de mise à jour, MySQL validera immédiatement le résultat

//开始事务
begin;/begin work;/start transaction;(三者选一个)
select status from t_goods where id=1 for update;
//根据商品信息生成订单
insert into t_orders (id,goods_id) values (null,1);
//修改商品status为2
update t_goods set status=2;
// 提交事务
commit;/commit work;

Dans l'instruction de requête ci-dessus, la méthode select...for update est utilisée pour implémenter le verrouillage pessimiste en activer le verrouillage exclusif. L'enregistrement correspondant est verrouillé et les autres transactions doivent attendre que cette transaction soit soumise avant de pouvoir être exécutées

Nous utilisons select... for update pour verrouiller les données, mais nous devons faire attention à certains niveaux de verrouillage, MySQL InnoDB utilise par défaut les verrous au niveau de la ligne. Les verrous au niveau des lignes sont basés sur des index. Si une instruction SQL n'utilise pas l'index, les verrous au niveau des lignes ne seront pas utilisés pour verrouiller la table entière.

Caractéristiques
  • Fournit une garantie pour la sécurité du traitement des données

  • En termes d'efficacité, grâce à traitement du verrouillage Le mécanisme entraînera une surcharge supplémentaire pour la base de données et augmentera le risque de blocage

  • Comme il n'y aura pas de conflits dans les transactions en lecture seule, il n'est pas nécessaire d'utiliser des verrous, ce qui augmentera la charge du système et réduira le parallélisme

Verrouillage optimiste

  • Le contrôle de concurrence optimiste est également une méthode de contrôle de concurrence.

  • En supposant que les transactions simultanées multi-utilisateurs ne s'affecteront pas pendant le traitement, chaque transaction peut traiter la partie des données qu'elle affecte sans générer de verrou, avant de soumettre la mise à jour des données, chacune La transaction vérifiera d'abord si d'autres transactions ont modifié les données après que la transaction ait lu les données, et si c'est le cas, annulera la transaction de soumission

Verrouillage optimiste relatif Pour le verrouillage pessimiste, il est supposé que les données ne seront pas en conflit, donc lorsque les données sont soumises pour mise à jour, le conflit des données sera officiellement détecté. Si un conflit est trouvé, un message d'erreur sera renvoyé à l'utilisateur pour lui permettre de décider quoi faire. faire. Pour implémenter

  • le verrouillage optimiste utilise généralement le numéro de version de l'enregistrement, ajoute une identification de version aux données et met à jour l'identification de version lorsque les données sont mises à jour

Implémentation

Lors de l'utilisation du numéro de version, vous pouvez spécifier un numéro de version lors de l'initialisation des données, et chaque opération de mise à jour sur les données effectuera une opération +1 sur le numéro de version. Et déterminez si le numéro de version actuel est le dernier numéro de version des données

1.查询出商品信息
select (status,status,version) from t_goods where id=#{id}
2.根据商品信息生成订单
3.修改商品status为2
update t_goods 
set status=2,version=version+1
where id=#{id} and version=#{version};
Caractéristiques

Le contrôle de concurrence optimiste estime que la probabilité de concurrence de données entre les transactions est faible, c'est donc fait aussi directement que possible Continuez et ne verrouillez pas jusqu'à la soumission, donc aucun verrou ou blocage ne se produira

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer