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.
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.
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);
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");
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();
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");
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:
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.
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.
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.
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.
$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");