Discussion sur les transactions et les problèmes de concurrence dans les bases de données
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.
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 ?
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.
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
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
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 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.
Sérialisable
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)
Lire les données comme le niveau de lecture engagé, mais conservera le verrou partagé jusqu'à la fin de la transaction.
Lire la validation
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
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.
La première question, les transactions peuvent-elles être simultanées ?
, 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. 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. 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. 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 ServerComment éviter les problèmes de concurrence
Documents de référence
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!