Maison développement back-end tutoriel php Le verrouillage optimiste PHP combiné avec le solde de déduction des transactions a échoué: comment s'assurer que le solde est correctement déduit dans les situations de concurrence?

Le verrouillage optimiste PHP combiné avec le solde de déduction des transactions a échoué: comment s'assurer que le solde est correctement déduit dans les situations de concurrence?

Mar 31, 2025 pm 11:42 PM
mysql 并发请求

Le verrouillage optimiste PHP combiné avec le solde de déduction des transactions a échoué: comment s'assurer que le solde est correctement déduit dans des situations de concurrence?

Verrouillage optimiste PHP combiné avec les transactions de base de données pour déduire l'équilibre: analyse des problèmes et solution

Cet article explique comment éviter les problèmes de concurrence qui conduisent à l'échec de la déduction de solde ou des données incohérentes lors de l'utilisation de verrous optimistes et de transactions de base de données pour la déduction de solde dans l'environnement PHP. Nous analyserons le code d'erreur et fournirons la bonne solution.

Analyse du code du problème et raisons d'erreur:

L'extrait de code suivant tente d'assurer l'exactitude des déductions de solde dans des environnements simultanés à travers des verrous et des transactions optimistes, mais a des défauts:

Extrait de code d'erreur 1:

 Fonction publique UserBuy ()
{
    $ user = $ this-> getuser (); 
    $ oldmoney = $ user ['Balance']; 
    $ ordonnanceOffer = $ this-> getOrderMoney ($ ordonnance); 
    if ($ oldmoney  error ('insuffisante le solde du compte');

    // Solution de verrouillage optimiste (mauvais points)
    $ newmoney = $ oldmoney - $ ordonnance à [«prix»]; 
    $ newuser = smsuser :: où (['id' => $ utilisateur ['id'], 'bilan' => $ oldmoney]) -> find ();
    si (! $ newUser) $ this-> error ('l'utilisateur n'existe pas');
    // Ouvrir la transaction de la base de données db :: transaction (function () use ($ newuser, $ orderId, $ newmoney) {
        $ NewUser-> Balance = $ NewMoney;
        $ result = $ newuser-> save ();
        if (! $ Result) $ this-> error ('économiser le solde échoué');

         // Créer un code de commande
         // Déduire le code d'inventaire
         // Créer un code d'enregistrement de modification de l'équilibre utilisateur    
        DB :: commit (); // engage une transaction (opération excessive)        
    });
}
Copier après la connexion

Cause d'erreur:

  1. Erreur de position de verrouillage optimiste: find() est exécutée en dehors de la transaction. Plusieurs demandes simultanées obtiennent la même valeur $oldmoney . Seule save() de la première demande réussit et les demandes suivantes échouent car balance n'est plus égal à $oldmoney . Le jugement conditionnel du verrouillage optimiste doit être fait dans update .

  2. db::commit() Redondant: db::transaction() elle-même commettra automatiquement la transaction à moins qu'une exception de retournement ne se produit. L'appel manuel à db::commit() est redondant et peut masquer les erreurs.

Extrait de code d'erreur 2:

 Fonction publique UserBuy ()
{
    // ... (le code est le même que ci-dessus, la pièce est omise) ...

    // Solution de verrouillage optimiste (mauvais points)
    $ NewUser-> Balance = $ NewMoney;
    $ result = $ newuser-> save ();
    if (! $ Result) $ this-> error ('économiser le solde échoué');

    // Ouvrir la transaction de la base de données (erreur)
    Db :: transaction (function () use () {
         // Créer un code de commande
         // Déduire le code d'inventaire
         // Créer un code d'enregistrement de modification de l'équilibre utilisateur    
        DB :: commit (); // engage une transaction (opération excessive)         
    });
}
Copier après la connexion

Cause d'erreur:

L'opération de mise à jour du solde est exécutée en dehors de la transaction. Si les opérations ultérieures (création de commandes, déduisant l'inventaire, etc.) échouent, le solde a été mis à jour, entraînant des données incohérentes.

Solution correcte:

Le jugement conditionnel du verrouillage optimiste doit être placé dans l'instruction update de la base de données, et toutes les opérations qui doivent garantir l'atomicité doivent être incluses dans la même transaction.

Code correct:

 Fonction publique UserBuy ()
{
    $ user = $ this-> getuser ();
    $ oldmoney = $ user ['Balance'];
    $ ordonnanceOffer = $ this-> getOrderMoney ($ ordonnance);
    if ($ oldmoney  error ('insuffisante le solde du compte');

    $ newmoney = $ oldmoney - $ ordonnance à [«prix»];

    // Utilisez des mécanismes de verrouillage optimistes pour les bases de données (comme MySQL)
    $ affecteRows = smsuse :: où ('id', $ utilisateur ['id'])
        -> Où ('Balance', $ oldmoney)
        -> Update (['Balance' => $ newmoney]);

    if ($ liectrows === 0) {
        $ this-> error ('La mise à jour du solde a échoué, il peut y avoir des conflits simultanés'); // Verrouillage optimiste a échoué Retour;
    }

    // Activer la transaction, y compris toutes les opérations suivantes DB :: Transaction (fonction () Utiliser ($ ordonnance, $ newmoney, $ utilisateur) {
        // Créer un code de commande
        // Déduire le code d'inventaire
        // Créer un code d'enregistrement de modification de l'équilibre utilisateur (assurez-vous que ces opérations sont également incluses dans la transaction)
    });
}
Copier après la connexion

Cette solution place les mises à jour de l'équilibre et les opérations ultérieures dans la même transaction et utilise le mécanisme de verrouillage optimiste fourni par la base de données pour garantir la cohérence des données. Si une opération échoue, la transaction reviendra automatiquement pour garantir la sécurité des données. Évitez les transactions manuelles, la simplification du code et l'amélioration de la lisibilité. Si le nombre de lignes affectées par l'instruction update est de 0, cela signifie que le verrou optimiste échoue et que les conflits simultanés doivent être gérés. De telles situations peuvent être manipulées à l'aide de mécanismes de réessayer ou d'autres stratégies. L'implémentation de verrouillage d'optimisme spécifique dépend du système de base de données utilisé.

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

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

<🎜>: Grow A Garden - Guide de mutation complet
3 Il y a quelques semaines By DDD
<🎜>: Bubble Gum Simulator Infinity - Comment obtenir et utiliser les clés royales
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Système de fusion, expliqué
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Whispers of the Witch Tree - Comment déverrouiller le grappin
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

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)

Sujets chauds

Tutoriel Java
1667
14
Tutoriel PHP
1273
29
Tutoriel C#
1255
24
Exemple d'introduction de Laravel Exemple d'introduction de Laravel Apr 18, 2025 pm 12:45 PM

Laravel est un cadre PHP pour la création facile des applications Web. Il fournit une gamme de fonctionnalités puissantes, notamment: Installation: Installez le Laravel CLI globalement avec Composer et créez des applications dans le répertoire du projet. Routage: définissez la relation entre l'URL et le gestionnaire dans Routes / web.php. Voir: Créez une vue dans les ressources / vues pour rendre l'interface de l'application. Intégration de la base de données: fournit une intégration prête à l'emploi avec des bases de données telles que MySQL et utilise la migration pour créer et modifier des tables. Modèle et contrôleur: le modèle représente l'entité de la base de données et le contrôleur traite les demandes HTTP.

Mysql et phpmyadmin: fonctionnalités et fonctions de base Mysql et phpmyadmin: fonctionnalités et fonctions de base Apr 22, 2025 am 12:12 AM

MySQL et PHPMyAdmin sont de puissants outils de gestion de la base de données. 1) MySQL est utilisé pour créer des bases de données et des tables et pour exécuter des requêtes DML et SQL. 2) PHPMYADMIN fournit une interface intuitive pour la gestion des bases de données, la gestion de la structure de la table, les opérations de données et la gestion de l'autorisation des utilisateurs.

MySQL vs d'autres langages de programmation: une comparaison MySQL vs d'autres langages de programmation: une comparaison Apr 19, 2025 am 12:22 AM

Par rapport à d'autres langages de programmation, MySQL est principalement utilisé pour stocker et gérer les données, tandis que d'autres langages tels que Python, Java et C sont utilisés pour le traitement logique et le développement d'applications. MySQL est connu pour ses performances élevées, son évolutivité et son support multiplateforme, adapté aux besoins de gestion des données, tandis que d'autres langues présentent des avantages dans leurs domaines respectifs tels que l'analyse des données, les applications d'entreprise et la programmation système.

Méthode d'installation de Laravel Framework Méthode d'installation de Laravel Framework Apr 18, 2025 pm 12:54 PM

Résumé de l'article: Cet article fournit des instructions détaillées étape par étape pour guider les lecteurs sur la façon d'installer facilement le cadre Laravel. Laravel est un puissant cadre PHP qui accélère le processus de développement des applications Web. Ce didacticiel couvre le processus d'installation des exigences du système à la configuration des bases de données et à la configuration du routage. En suivant ces étapes, les lecteurs peuvent jeter rapidement et efficacement une base solide pour leur projet Laravel.

Expliquez le but des clés étrangères dans MySQL. Expliquez le but des clés étrangères dans MySQL. Apr 25, 2025 am 12:17 AM

Dans MySQL, la fonction des clés étrangères est d'établir la relation entre les tables et d'assurer la cohérence et l'intégrité des données. Les clés étrangères maintiennent l'efficacité des données grâce à des contrôles d'intégrité de référence et aux opérations en cascade. Faites attention à l'optimisation des performances et évitez les erreurs courantes lorsque vous les utilisez.

Comparez et contrastez MySQL et Mariadb. Comparez et contrastez MySQL et Mariadb. Apr 26, 2025 am 12:08 AM

La principale différence entre MySQL et MARIADB est les performances, les fonctionnalités et la licence: 1. MySQL est développé par Oracle, et MariADB est sa fourche. 2. MariaDB peut mieux fonctionner dans des environnements à haute charge. 3.MariaDB fournit plus de moteurs et de fonctions de stockage. 4.MySQL adopte une double licence et MariaDB est entièrement open source. L'infrastructure existante, les exigences de performance, les exigences fonctionnelles et les coûts de licence doivent être pris en compte lors du choix.

SQL vs MySQL: clarifier la relation entre les deux SQL vs MySQL: clarifier la relation entre les deux Apr 24, 2025 am 12:02 AM

SQL est un langage standard pour gérer les bases de données relationnelles, tandis que MySQL est un système de gestion de bases de données qui utilise SQL. SQL définit les moyens d'interagir avec une base de données, y compris les opérations CRUD, tandis que MySQL implémente la norme SQL et fournit des fonctionnalités supplémentaires telles que les procédures stockées et les déclencheurs.

Quel logiciel est le meilleur pour Yi Framework? Logiciel recommandé pour Yi Framework Quel logiciel est le meilleur pour Yi Framework? Logiciel recommandé pour Yi Framework Apr 18, 2025 pm 11:03 PM

Résumé du premier paragraphe de l'article: Lors du choix du logiciel pour développer des applications de framework YI, plusieurs facteurs doivent être pris en compte. Bien que les outils de développement d'applications mobiles natifs tels que Xcode et Android Studio puissent offrir un contrôle et une flexibilité solides, les cadres multiplateformes tels que React Native et Flutter deviennent de plus en plus populaires avec les avantages de pouvoir se déployer sur plusieurs plates-formes à la fois. Pour les développeurs nouveaux dans le développement mobile, les plates-formes à faible code ou sans code telles que Appsheet et Glide peuvent créer rapidement et facilement des applications. De plus, les fournisseurs de services cloud tels que AWS Amplify et Firebase fournissent des outils complets

See all articles