Maison > Java > le corps du texte

Existe-t-il une solution pour effectuer simultanément des opérations de base de données identiques/similaires via plusieurs threads ?

WBOY
Libérer: 2024-02-22 12:31:06
avant
633 Les gens l'ont consulté

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.

Contenu de la question

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 :

  1. Deadlock car deux threads (requêtes) mettent à jour les enregistrements de l'utilisateur en même temps, par exemple en stockant la date/heure de la dernière connexion de l'utilisateur.
  2. Exception de données périmées car un thread a mis à jour l'utilisateur avant la fin de la transaction d'un autre thread.

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 ?

Solution

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;
Copier après la connexion

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 = ?;
Copier après la connexion

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;
Copier après la connexion

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!

source:stackoverflow.com
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!