Questions et réponses Java apportées par l'éditeur PHP Zimo : existe-t-il une solution pour permettre à plusieurs threads d'effectuer des opérations de base de données identiques/similaires en même temps ? Au cours du processus de développement, la question de savoir comment gérer efficacement plusieurs threads exécutant simultanément la base de données a toujours attiré beaucoup d'attention. Cet article présentera plusieurs solutions, notamment l'utilisation de pools de connexions de base de données, de mécanismes de verrouillage, de traitement des transactions et d'autres méthodes, pour aider les développeurs à résoudre ce problème. Voyons comment implémenter des opérations de base de données simultanées multithread pour améliorer les performances et la stabilité du système.
En utilisant Java, Spring Boot et Hibernate, existe-t-il un moyen de permettre à plusieurs threads d'effectuer une opération donnée simultanément sans provoquer de blocages ou d'exceptions de données obsolètes.
Par exemple, supposons que l'outil automatisé se connecte deux fois en même temps, ce qui entraîne l'une des situations suivantes :
Cela pourrait être résolu en ajoutant une synchronisation sur l'ID utilisateur, mais ce genre de chose devrait se produire partout, ce qui entraînerait une pénalité potentielle en termes de performances et rendrait la base de code plus volumineuse et plus difficile à maintenir.
Alternativement, nous pouvons ajuster le niveau d'isolement (nous pouvons peut-être définir le niveau par défaut globalement). Est-ce une meilleure solution ou existe-t-il d'autres solutions ?
Verrouillage pessimiste.
Verrouillez toutes les lignes qui pourraient devoir être mises à jour au début de la transaction. Vous pouvez le faire en utilisant locking read.
select ... from users where user_id = ? for update;
Un seul fil de discussion l'obtiendra. Les autres threads attendront que ce thread libère le verrou.
Pendant ce temps, le fil de discussion détenant le verrou peut mettre à jour la ligne lorsqu'il est prêt.
update users set last_login = now() where user_id = ?;
Ensuite, pour être poli envers les autres discussions, veuillez les soumettre dès que possible après update
. Cela libère automatiquement le verrou.
COMMIT;
Cela permet au prochain thread en file d'attente d'acquérir le verrou qu'il attend.
Vous pouvez utiliser le verrouillage des lectures pour verrouiller plusieurs lignes, même plusieurs lignes dans plusieurs tables. select
Toutes les lignes vérifiées par la requête seront verrouillées. Si vous devez verrouiller des lignes dans plusieurs tables, vous pouvez effectuer des opérations telles que la jointure.
L'acquisition de verrous est atomique, donc une instruction de verrouillage donnée doit acquérir tous verrous demandés, sinon elle doit attendre.
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!