Table des matières
1 Connaissances de base
1.1 Verrouillage partagé et verrouillage exclusif
1.2 Lecture actuelle et lecture d'instantané
2 Principe de verrouillage optimiste
3 Principe de déduction d'inventaire
Maison base de données tutoriel mysql Quel est le principe de l'inventaire de déduction de verrouillage optimiste dans MySQL

Quel est le principe de l'inventaire de déduction de verrouillage optimiste dans MySQL

Jun 03, 2023 am 09:30 AM
mysql

    1 Connaissances de base

    La déduction des stocks dans le système de commerce électronique est une opération très critique. Par exemple, dans le système de vente flash, les conditions de survente doivent être évitées si le commerçant met en place 100 pièces en stock mais termine. en vendant 1 000 pièces, ce qui entraînera des pertes financières. L'énoncé suivant est généralement utilisé lors de la déduction des stocks :

    udpate goods set stock = stock - #{acquire} 
    where sku_id = #{skuId} and stock - #{acquire} >= 0
    Copier après la connexion

    Analysons comment cet énoncé peut efficacement empêcher la survente des stocks afin de protéger les ressources d'inventaire. Dans la démonstration de cet article, nous utilisons le moteur MySQL Innodb et définissons le niveau d'isolation sur lecture répétable.

    1.1 Verrouillage partagé et verrouillage exclusif

    Le verrouillage partagé (verrouillage partagé) est également appelé verrouillage en lecture. L'instruction pour implémenter le verrouillage partagé est la suivante :

    select lock in share mode
    Copier après la connexion

    Le verrouillage exclusif (verrouillage exclusif) est également appelé verrouillage en écriture et implémente le verrouillage exclusif. L'instruction de verrouillage est la suivante :

    select for update
    update
    delete
    insert
    Copier après la connexion

    La relation de compatibilité entre les verrous partagés et les verrous exclusifs est la suivante :

    Quel est le principe de linventaire de déduction de verrouillage optimiste dans MySQL

    Nous analysons la relation de compatibilité ci-dessus à travers des exemples. Tout d'abord, construisons une table de test et écrivons les données de test :

    CREATE TABLE `test_account` (
      `id` bigint(20) NOT NULL,
      `name` varchar(20) DEFAULT NULL,
      `account` bigint(20) DEFAULT NULL,
      `version` bigint(20) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    insert  into `test_account`(`id`,`name`,`account`,`version`) values (1,'A',100,1);
    insert  into `test_account`(`id`,`name`,`account`,`version`) values (2,'B',200,1);
    insert  into `test_account`(`id`,`name`,`account`,`version`) values (3,'C',300,1);
    Copier après la connexion

    . (1) Compatible en lecture et en lecture

    Les verrous partagés sont compatibles avec les verrous partagés. Dans l'exemple suivant, session1 exécute la requête à t3 et session2 exécute la requête à t4 pour obtenir les résultats attendus :

    Quel est le principe de linventaire de déduction de verrouillage optimiste dans MySQL

    ( 2) Exclusion mutuelle en lecture et en écriture

    Les verrous partagés et les verrous exclusifs s'excluent mutuellement. Dans l'exemple suivant, session1 ajoute un verrou partagé à l'instant t3, et le résultat peut être lu correctement, mais session2 essaie d'ajouter un verrou exclusif à l'instant t3. temps t4, mais le verrou est occupé par session1 à ce moment-là. Lorsque session1 ne libère pas le verrou pendant une longue période, session2 génère une exception de délai d'expiration de verrouillage :

    Quel est le principe de linventaire de déduction de verrouillage optimiste dans MySQL

    (3) Write-write. exclusion mutuelle

    Le verrouillage exclusif et le verrouillage exclusif s'excluent mutuellement, comme suit Dans l'exemple, session1 ajoute un verrou exclusif au temps t3, et le résultat peut être lu correctement, mais session2 essaie d'ajouter un verrou exclusif au temps t4, mais le verrou est occupé par session1 à ce moment-là, et session2 doit attendre. Lorsque session1 ne libère pas le verrou pendant une longue période, session2 Exception de délai d'attente de verrouillage levée :

    Quel est le principe de linventaire de déduction de verrouillage optimiste dans MySQL

    1.2 Lecture actuelle et lecture d'instantané

    Stockage MySQL Innodb. la mise en œuvre du moteur est basée sur le protocole de contrôle de concurrence multiversion MVCC. Dans le contrôle de concurrence MVCC, les opérations de lecture peuvent être divisées en lectures d'instantanés et lectures actuelles.

    La lecture d'instantanés ne nécessite pas de verrouillage. Ce qui est lu est la version visible de l'enregistrement, qui peut être une version historique. Semblable à un instantané de commande, même si le prix du produit change après que l'utilisateur a passé la commande, l'instantané de commande reste inchangé. L'instruction de lecture actuelle est implémentée comme suit :

    select
    Copier après la connexion

    Afin de lire la dernière version de l'enregistrement sans être modifié par d'autres transactions, l'enregistrement actuel doit être verrouillé. L'implémentation de l'instruction de lecture actuelle est la suivante :

    select lock in share mode
    select for update
    update
    delete
    insert
    Copier après la connexion

    Nous analysons l'instantané lu et la lecture actuelle à travers un exemple. Session2 modifie l'enregistrement à t4 et le soumet à t5, effectue un instantané lu à t6 et lit le résultat. au début de cette transaction. 100. La lecture actuelle a été effectuée à l'instant t7, et la dernière version de l'enregistrement a été lue :

    Quel est le principe de linventaire de déduction de verrouillage optimiste dans MySQL

    Comment se déroule le processus de lecture actuel ? Prenons la mise à jour comme exemple pour analyser le processus de lecture actuel :

    Quel est le principe de linventaire de déduction de verrouillage optimiste dans MySQL

    La première fois que l'instance du programme émet la requête de lecture actuelle, le moteur de stockage renvoie le premier enregistrement qui répond à la condition Where et le verrouille, l'instance du programme émet une nouvelle demande de mise à jour, et le stockage provoque la réponse L'opération terminée a réussi. Exécutez dans l'ordre jusqu'à ce que tous les enregistrements qui satisfont à la condition Where soient exécutés.

    Ici, nous réalisons quelques extensions. Le niveau RR fournit deux mécanismes pour éviter les problèmes de lecture fantôme : La première méthode est la lecture d'instantané, qui lit l'instantané lorsque la transaction en cours est démarrée. Une méthode pour les lectures en cours consiste à utiliser le mécanisme Next-Key Lock pour empêcher les lectures fantômes.

    2 Principe de verrouillage optimiste

    Nous intégrons les connaissances ci-dessus à travers une question : il y a deux threads exécutant les instructions suivantes en même temps. La valeur du compte de l'enregistrement avec id=1 sera-t-elle déduite avec succès deux fois ?

    update test_account set account = account - 100, version = version + 1 
    where id = 1 and version = 1
    Copier après la connexion

    La déclaration ci-dessus utilise le verrouillage optimiste. Nous savons que le verrouillage optimiste protège les ressources, donc la réponse est qu'il ne sera pas déduit deux fois, mais il ne peut pas s'arrêter là. Il doit être analysé plus en détail sur la base des connaissances du chapitre 1 :

    Quel est le principe de linventaire de déduction de verrouillage optimiste dans MySQL

    A l'instant t2, session1 et session2 exécutent les opérations de mise à jour en même temps. Puisque la mise à jour ajoutera un verrou exclusif, un seul des deux peut réussir : session1 réussit et session2 bloque en attendant que le verrou exclusif soit libéré. .

    Au moment t3, session1 valide la transaction et libère le verrou exclusif. À ce moment, session2 acquiert le verrou pour la lecture en cours, mais à ce moment, la valeur de version de l'enregistrement avec id=1 est passée à 2. L'instruction exécutée. ne peut pas interroger les données à mettre à jour, aucun enregistrement n'est donc renouvelé.

    3 Principe de déduction d'inventaire

    Si vous comprenez le principe de verrouillage optimiste du chapitre 2, le principe de déduction d'inventaire est déjà évident. Nous supposons qu'il ne reste qu'un seul article en stock si deux threads exécutent la déduction d'inventaire en même temps. temps, cela arrivera Situation de survente ?

    Quel est le principe de linventaire de déduction de verrouillage optimiste dans MySQL

    Au temps t2, session1 et session2 exécutent updatek pour réduire l'inventaire en même temps. Puisque la mise à jour ajoutera un verrou exclusif, un seul des deux peut réussir : session1 réussit et session2 bloque en attendant le verrou exclusif. être libéré.

    Au temps t3, la session1 valide la transaction et libère le verrou exclusif. A ce moment, la session2 obtient le verrou pour la lecture en cours, mais à ce moment, l'inventaire du produit 1 est devenu 0, et le (où stock - 1 >). ;= 0) la condition n'est plus remplie. Exécuter l'instruction. Les données à mettre à jour ne peuvent pas être interrogées, donc aucun enregistrement n'est mis à jour.

    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 de ce site Web
    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

    Outils d'IA chauds

    Undresser.AI Undress

    Undresser.AI Undress

    Application basée sur l'IA pour créer des photos de nu réalistes

    AI Clothes Remover

    AI Clothes Remover

    Outil d'IA en ligne pour supprimer les vêtements des photos.

    Undress AI Tool

    Undress AI Tool

    Images de déshabillage gratuites

    Clothoff.io

    Clothoff.io

    Dissolvant de vêtements AI

    AI Hentai Generator

    AI Hentai Generator

    Générez AI Hentai gratuitement.

    Article chaud

    R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
    2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
    Repo: Comment relancer ses coéquipiers
    4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
    Hello Kitty Island Adventure: Comment obtenir des graines géantes
    3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
    Combien de temps faut-il pour battre Split Fiction?
    3 Il y a quelques semaines By DDD

    Outils chauds

    Bloc-notes++7.3.1

    Bloc-notes++7.3.1

    Éditeur de code facile à utiliser et gratuit

    SublimeText3 version chinoise

    SublimeText3 version chinoise

    Version chinoise, très simple à utiliser

    Envoyer Studio 13.0.1

    Envoyer Studio 13.0.1

    Puissant environnement de développement intégré PHP

    Dreamweaver CS6

    Dreamweaver CS6

    Outils de développement Web visuel

    SublimeText3 version Mac

    SublimeText3 version Mac

    Logiciel d'édition de code au niveau de Dieu (SublimeText3)

    Compétences de traitement de structures de données volumineuses de PHP Compétences de traitement de structures de données volumineuses de PHP May 08, 2024 am 10:24 AM

    Compétences en matière de traitement de la structure des Big Data : Chunking : décomposez l'ensemble de données et traitez-le en morceaux pour réduire la consommation de mémoire. Générateur : générez des éléments de données un par un sans charger l'intégralité de l'ensemble de données, adapté à des ensembles de données illimités. Streaming : lisez des fichiers ou interrogez les résultats ligne par ligne, adapté aux fichiers volumineux ou aux données distantes. Stockage externe : pour les ensembles de données très volumineux, stockez les données dans une base de données ou NoSQL.

    Comment optimiser les performances des requêtes MySQL en PHP ? Comment optimiser les performances des requêtes MySQL en PHP ? Jun 03, 2024 pm 08:11 PM

    Les performances des requêtes MySQL peuvent être optimisées en créant des index qui réduisent le temps de recherche d'une complexité linéaire à une complexité logarithmique. Utilisez PreparedStatements pour empêcher l’injection SQL et améliorer les performances des requêtes. Limitez les résultats des requêtes et réduisez la quantité de données traitées par le serveur. Optimisez les requêtes de jointure, notamment en utilisant des types de jointure appropriés, en créant des index et en envisageant l'utilisation de sous-requêtes. Analyser les requêtes pour identifier les goulots d'étranglement ; utiliser la mise en cache pour réduire la charge de la base de données ; optimiser le code PHP afin de minimiser les frais généraux.

    Comment utiliser la sauvegarde et la restauration MySQL en PHP ? Comment utiliser la sauvegarde et la restauration MySQL en PHP ? Jun 03, 2024 pm 12:19 PM

    La sauvegarde et la restauration d'une base de données MySQL en PHP peuvent être réalisées en suivant ces étapes : Sauvegarder la base de données : Utilisez la commande mysqldump pour vider la base de données dans un fichier SQL. Restaurer la base de données : utilisez la commande mysql pour restaurer la base de données à partir de fichiers SQL.

    Comment insérer des données dans une table MySQL en utilisant PHP ? Comment insérer des données dans une table MySQL en utilisant PHP ? Jun 02, 2024 pm 02:26 PM

    Comment insérer des données dans une table MySQL ? Connectez-vous à la base de données : utilisez mysqli pour établir une connexion à la base de données. Préparez la requête SQL : Écrivez une instruction INSERT pour spécifier les colonnes et les valeurs à insérer. Exécuter la requête : utilisez la méthode query() pour exécuter la requête d'insertion en cas de succès, un message de confirmation sera généré.

    Comment corriger les erreurs mysql_native_password non chargé sur MySQL 8.4 Comment corriger les erreurs mysql_native_password non chargé sur MySQL 8.4 Dec 09, 2024 am 11:42 AM

    L'un des changements majeurs introduits dans MySQL 8.4 (la dernière version LTS en 2024) est que le plugin « MySQL Native Password » n'est plus activé par défaut. De plus, MySQL 9.0 supprime complètement ce plugin. Ce changement affecte PHP et d'autres applications

    Comment utiliser les procédures stockées MySQL en PHP ? Comment utiliser les procédures stockées MySQL en PHP ? Jun 02, 2024 pm 02:13 PM

    Pour utiliser les procédures stockées MySQL en PHP : Utilisez PDO ou l'extension MySQLi pour vous connecter à une base de données MySQL. Préparez l'instruction pour appeler la procédure stockée. Exécutez la procédure stockée. Traitez le jeu de résultats (si la procédure stockée renvoie des résultats). Fermez la connexion à la base de données.

    Comment créer une table MySQL en utilisant PHP ? Comment créer une table MySQL en utilisant PHP ? Jun 04, 2024 pm 01:57 PM

    La création d'une table MySQL à l'aide de PHP nécessite les étapes suivantes : Connectez-vous à la base de données. Créez la base de données si elle n'existe pas. Sélectionnez une base de données. Créer un tableau. Exécutez la requête. Fermez la connexion.

    La différence entre la base de données Oracle et MySQL La différence entre la base de données Oracle et MySQL May 10, 2024 am 01:54 AM

    La base de données Oracle et MySQL sont toutes deux des bases de données basées sur le modèle relationnel, mais Oracle est supérieur en termes de compatibilité, d'évolutivité, de types de données et de sécurité ; tandis que MySQL se concentre sur la vitesse et la flexibilité et est plus adapté aux ensembles de données de petite et moyenne taille. ① Oracle propose une large gamme de types de données, ② fournit des fonctionnalités de sécurité avancées, ③ convient aux applications de niveau entreprise ; ① MySQL prend en charge les types de données NoSQL, ② a moins de mesures de sécurité et ③ convient aux applications de petite et moyenne taille.

    See all articles