0

J'ai une table avec CREDIT_POINTS. Il a ci-dessous les colonnes.Mise à jour de la table dans un environnement multithread

Copmany Credit points Amount 

A   100    50 
B   200    94 
C   250    80 

Plusieurs threads mettront à jour cette table. Il y a une méthode qui lit points de crédit et faire quelques calculs et mettre à jour montant ainsi que points de crédit. Ce calcul prendra beaucoup de temps.

Supposons que le thread A lit et effectue des calculs. En même temps, avant que A réécrive le thread B lit les données de la table pour effectuer des calculs et mettre à jour les données. Ici, je perds les données que le fil A a mis à jour. Dans de nombreux cas, les points de crédit et le montant ne seront pas synchronisés car plusieurs threads lisent et mettent à jour la table.

Une chose que nous pouvons faire ici est d'utiliser une méthode synchronisée. Je pense utiliser la transaction de printemps. Le thread de transaction Spring est-il sécurisé? Quoi d'autre est une bonne option pour cela? Toute aide grandement appréciée.

Remarque: j'utilise ibatis (ORM) et MySQL.

Répondre

1

Vous avez certainement besoin de transactions pour vous assurer que vous effectuez vos mises à jour en fonction des données que vous avez précédemment lues. Cette transaction doit inclure une opération de lecture et d'écriture. Pour vous assurer que plusieurs threads vous ne coopèrent pas besoin synchronisé, mais ont deux options:

  • verrouillage pessimiste: vous utilisez de sélection pour la mise à jour. Cela va définir un verrou qui sera libéré à la fin de la transaction.
  • verrouillage optimiste: lors de votre mise à jour, vous découvrez que les données ont été modifiées entre-temps, si c'est le cas, vous devez répéter la lecture et le changement. Vous pouvez réaliser ceci dans votre déclaration de mise à jour en cherchant non seulement la compagnie (la clé primaire, j'espère), mais aussi le montant et les points de crédit lus précédemment.

Les deux méthodes ont leurs mérites. Je recommande de vous familiariser avec ces concepts avant de terminer cette application. Dès qu'il y a une charge importante, si vous avez fait quelque chose de mal, vos montants et vos points de crédit pourraient être mal calculés.

+0

L'utilisation de transaction de printemps a résolu mon problème. Merci aschoerk – user2823355