Maison  >  Article  >  base de données  >  Exemples de problèmes de transactions et de concurrence dans les bases de données

Exemples de problèmes de transactions et de concurrence dans les bases de données

零下一度
零下一度original
2017-07-03 16:10:391303parcourir

Discussion sur les transactions et les problèmes de concurrence dans les bases de données

Introduction

Récemment, un collègue a écrit un morceau de code responsable de la logique de création des commandes, lors de la révision du code. découvert qu'il pouvait y avoir des problèmes de concurrence. Mon collègue n'était pas d'accord. Il pensait que sa logique était écrite dans la procédure stockée et qu'il ne devrait y avoir aucun problème.

La logique du code est probablement (pseudocode) :

begin transaction

if 查询到客户存在进行中的订单
 rollback transaction

if 查询到设备存在进行中的订单
 rollback transaction

插入订单

commit transaction

Ce qui suit analysera cette logique et pourquoi cette transaction aura des problèmes de concurrence.

Aperçu de la transaction

Tout d'abord, posez deux questions, puis discutez des points de connaissances liés à la transaction avec les questions, et enfin résolvez ces deux questions et répondez aux questions précédentes.

La première question, les transactions peuvent-elles être simultanées ?

La deuxième question, comment la base de données isole-t-elle les transactions ?

Caractéristiques de performance des transactions

L'exécution de transactions dans la base de données implique de nombreux aspects, notamment la façon de gérer les ressources critiques, la façon de verrouiller et de déverrouiller, etc. Cependant, quelle que soit la manière dont la transaction est exécutée, les caractéristiques suivantes doivent être garanties :

  • Atomicité

  • Cohérence

  • Isolement

  • Persistance

  • Atomicité : Toutes les opérations sont une unité logique, qu'elles soient soumises avec succès ou qu'elles aient échoué

     ; Cohérence : seules les données légales sont écrites dans la base de données, sinon la transaction est rétablie à son état d'origine

    Isolement : plusieurs transactions sont autorisées à se dérouler en même temps sans détruire l'exactitude de la stabilité et de l'intégrité des données ; ;

    Persistance : Une fois la transaction terminée, les résultats soumis sont solidifiés et enregistrés.

    Divers verrous de bases de données

  1. Verrous partagés

Les verrous partagés sont utilisés pour des affaires non exclusives et permettent plusieurs transactions. Lit également la ressource verrouillée, mais ne permet pas la mise à jour de la ressource.

  • Synchronisation de verrouillage : lors de l'exécution de l'instruction select, elle sera ajoutée par défaut

  • Synchronisation de déverrouillage : elle sera libérée par défaut après l'exécution de la lecture

  • Compatibilité avec d'autres verrous : si un verrou partagé est défini sur les données, plus aucun verrou partagé et les verrous exclusifs ne seront autorisés

  • Performances de concurrence : avec de bonnes performances de concurrence

    1. Verrouillage exclusif

    Verrouillage exclusif, également appelé verrouillage exclusif. Comme son nom l'indique, une ressource verrouillée par un verrou exclusif ne permettra à d'autres transactions d'effectuer aucune opération.

  • Synchronisation du verrouillage : lors de l'exécution de l'insertion, de la mise à jour, de la suppression, elle sera ajoutée par défaut

  • Compatibilité : S'il existe d'autres verrous sur les données, des verrous exclusifs ne peuvent pas être ajoutés ; de même, les verrous exclusifs ne permettront pas d'ajouter d'autres verrous en même temps

  • Performances de concurrence : les autres transactions doivent attendre la fin de la transaction précédente avant de pouvoir être exécutées. Elles ne peuvent pas être exécutées simultanément et ne peuvent être exécutées qu'en série

  • Mise à jour du verrouillage
    1. Utilisé. pour verrouiller les ressources requises lors de la phase initiale de la mise à jour afin d'éviter les blocages provoqués par l'utilisation de verrous partagés pendant la phase de lecture.

    Minutage de verrouillage : lors de l'exécution de la mise à jour, utilisez le verrouillage de mise à jour pour verrouiller les ressources associées.

  • Minutage de déverrouillage : après la lecture, lors de l'exécution de l'opération de mise à jour, le verrouillage de mise à jour est mis à niveau Pour les verrous exclusifs

  • Compatibilité : les verrous de mise à jour sont compatibles avec les verrous partagés, c'est-à-dire que les verrous de mise à jour et les verrous partagés peuvent exister en même temps, mais il ne peut y avoir qu'un seul verrou de mise à jour

  • Performances de concurrence : au début de la phase de lecture de la mise à jour, d'autres transactions peuvent être autorisées à lire les ressources et une concurrence limitée n'est pas autorisée lorsque les ressources sont exclusives à un stade ultérieur.

  • Niveau d'isolation des transactions

    Il existe quatre niveaux généraux d'isolation des transactions, et SQL Server a des niveaux étendus supplémentaires, que je ne présenterai pas en détail ici.
  • Sérialisable

    1. Fonctionne comme des lectures répétables. Mais cela ne verrouille pas seulement les données concernées, il verrouille également la plage. Cela empêche l'insertion de nouvelles données dans la plage couverte par la requête, une situation qui peut conduire à des lectures fantômes.

    Lecture répétable (lecture répétable)

    1. Lire les données comme le niveau de lecture engagé, mais conservera le verrou partagé jusqu'à la fin de la transaction.

    Lire la validation

    1. Lisez uniquement les données validées et attendez que d'autres transactions libèrent le verrou exclusif. Le verrou partagé pour la lecture des données est libéré immédiatement après la fin de l'opération de lecture. Lecture validée est le niveau d'isolement par défaut de SQL Server.

    Lecture non validée

    1. Aucun verrou n'est vérifié ou utilisé lors de la lecture des données. Par conséquent, il est possible de lire des données non validées dans ce niveau d'isolement.

    2. Répondez à la question précédente

    La première question, les transactions peuvent-elles être simultanées ?

    La réponse est oui, afin d'améliorer les performances, la base de données permet plusieurs transactions simultanées

    Opération de transaction

    , cette transaction n'a rien à voir avec la méthode d'initiation

    Utilisez une procédure stockée

    pour lancer, ou utilisez du code pour lancer, ou utilisez une instruction SQL ordinaire pour lancer. La deuxième question est la suivante : comment la base de données isole-t-elle les transactions ?

    Pour répondre à cette question, vous devez d'abord comprendre le mécanisme de verrouillage et le niveau d'isolation des transactions de base de données dans la base de données. Les verrous de la base de données peuvent être divisés en trois types : les verrous partagés, les verrous exclusifs et les verrous de mise à jour. Utilisez différents niveaux de verrous et coopérez avec différentes étendues de verrouillage pour atteindre différents niveaux d'isolation des transactions et exécuter des transactions simultanément ou en série sur cette base.

    La troisième question, pourquoi la transaction au début de cet article a-t-elle des problèmes de concurrence ?

    Parce que select est exécuté au début de la transaction et que select utilise un verrou partagé, il est possible que des transactions simultanées exécutent select en même temps, ce qui les amène à penser qu'il s'agit toutes d'opérations légales en même temps. temps et faites la queue pour exécuter les transactions suivantes. En conséquence, il est effectivement possible d'insérer des données en double, par exemple, il ne reste qu'un seul produit, mais deux commandes clients sont créées.

    Comment éviter les problèmes de concurrence

    1. Dans une transaction

    Selon ce qui a été dit précédemment, en utilisant insert, update ou la suppression peut être effectuée dans une transaction. Le niveau de transaction par défaut provoque artificiellement la sérialisation de la transaction, vous pouvez donc utiliser la mise à jour pour mettre à jour une donnée commune au début de la transaction. Dans ce cas, les transactions du même type seront sérialisées, puis ajouter une. déclaration de jugement , utilisée pour déterminer si le contenu de la transaction ultérieure doit être exécuté. Cela suffit pour garantir que toutes les opérations sont effectuées de manière raisonnable et légale. Le seul inconvénient est que cela peut entraîner des problèmes de performances.

    1. En dehors de la transaction

    Il existe de plus en plus de systèmes distribués, mais les systèmes redistribués auront également des ressources partagées, comme redis ou zookeeper , vous pouvez utiliser redis ou zookeeper pour créer des verrous distribués (ce type appartient à d'autres articles de blog et ne sera pas développé ici). Utiliser des verrous en dehors de la transaction pour sérialiser les transactions du même type, puis coopérer avec le mécanisme de vérification interne de la transaction, suffit à garantir que le problème de concurrence de la transaction est résolu.

    Documents de référence

  • Problèmes et traitement de la concurrence des transactions

  • Les quatre principales caractéristiques des transactions de base de données et le niveau d'isolement des transactions

  • Transactions de base de données et concurrence

  • Niveau d'isolement des transactions SQL Server


  • 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:
    Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn