Position actuelle: Accueil> Derniers articles> Solution pratique pour verrouiller le traitement des transactions dans des environnements de concurrence élevés de PHP et MySQL

Solution pratique pour verrouiller le traitement des transactions dans des environnements de concurrence élevés de PHP et MySQL

gitbox 2025-07-02

Aperçu des problèmes de concurrence dans des environnements de concurrence élevés

Dans les scénarios où plusieurs utilisateurs accèdent à la base de données en même temps, l'incohérence des données ou la perte de mise à jour se produisent souvent. Cela est principalement dû au fait que plusieurs demandes fonctionnent les mêmes données en même temps, ce qui entraîne des conditions de course.

Application de la technologie de verrouillage dans un contrôle simultané

Le verrouillage est l'un des moyens efficaces de résoudre les conflits simultanés. Dans PHP, nous pouvons utiliser le mécanisme de transaction de MySQL pour contrôler l'ordre d'accès et le processus de modification des données.

Activer le contrôle des transactions

En désactivant les validations automatiques et en gérant manuellement les commits et les reculs, l'atomicité des opérations de données peut être assurée. L'exemple de code est le suivant:

 
$conn = new mysqli("localhost", "username", "password", "database");
$conn->autocommit(false);

Verrouiller les données de lecture

Pour éviter que les données ne soient modifiées lors de la lecture simultanée, vous pouvez utiliser la déclaration de lecture verrouillée SELECT ... pour la mise à jour pour vous assurer que les données lues dans la transaction actuelle ne sont pas modifiées par d'autres transactions:

 
$conn->query("SELECT * FROM mytable WHERE id = 1 FOR UPDATE");

Modifier les données et soumettre des transactions

Après les données de verrouillage avec les instructions de verrouillage, effectuez des opérations de mise à jour et soumettez les transactions pour garantir la cohérence des données:

 
$conn->query("SELECT * FROM mytable WHERE id = 1 FOR UPDATE");
// Modifier les données
$conn->query("UPDATE mytable SET name = 'newname' WHERE id = 1");
$conn->commit();

Stratégie de manutention de blocage

Les impasses sont inévitables lorsqu'il y a une concurrence élevée. Vous pouvez réduire l'occurrence de l'impasse en définissant le temps de temps d'attente de verrouillage et en relâchez la transaction après le délai d'expiration pour libérer le verrou:

 
$conn->query("SET innodb_lock_wait_timeout = 3");

Autres solutions pour optimiser la concurrence

En plus du verrouillage, les méthodes suivantes peuvent être utilisées pour améliorer les performances du système dans des environnements de concurrence élevés:

Fragment de données

Diviser les données en plusieurs instances de base de données, disperser la charge, réduire la pression à un magasin et améliorer le débit global.

Mécanisme de cache

En mettant en cache les données sur hotspot, réduisez la fréquence de l'accès direct à la base de données, réduisez les chances de conflits simultanés et accélérez la vitesse de réponse.

Optimisation de la base de données

Index de conception rationnels et partitions de table, optimiser les chemins de requête, raccourcir le temps de maintien et améliorer encore les capacités de traitement simultanées.

Résumer

Dans les scénarios de concurrence élevés entre PHP et MySQL, l'utilisation rationnelle des transactions et des mécanismes de verrouillage est un moyen important pour garantir la cohérence des données. Dans le même temps, la combinaison de la ceinture de données, de l'optimisation du cache et de la base de données peut améliorer considérablement la stabilité et les performances du système. Les développeurs doivent utiliser de manière flexible une variété de stratégies à la lumière des besoins commerciaux et surveiller en continu et régler les performances du système.

Exemple de résumé de code

 
$conn = new mysqli("localhost", "username", "password", "database");
$conn->autocommit(false);
$conn->query("SELECT * FROM mytable WHERE id = 1 FOR UPDATE");
$conn->query("UPDATE mytable SET name = 'newname' WHERE id = 1");
$conn->commit();
$conn->query("SET innodb_lock_wait_timeout = 3");