


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?
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) }); }
Cause d'erreur:
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
. Seulesave()
de la première demande réussit et les demandes suivantes échouent carbalance
n'est plus égal à$oldmoney
. Le jugement conditionnel du verrouillage optimiste doit être fait dansupdate
.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) }); }
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) }); }
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!

Outils d'IA chauds

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

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

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

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

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

Sujets chauds











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 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.

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.

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.

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.

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 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.

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
