2024-04-05 20:10:00
J’ai donc une entité de compte dans Spring JPA et POstgres en tant que DB et je souhaite transférer de l’argent d’un compte à un autre. J’essaie de comprendre quel est le niveau d’isolement correct pour une telle chose ?
@Entity public class Account { @Id private Identifiant long ; double solde privé ; } …//Service @Transactional void createTransaction(double montant, long fromAccountId, long toAccountId) { Compte fromAccount = référentiel.findById(fromAccountId); Compte toAccount = référentiel.findById(toAccountId); if (fromAccount.getBalance() < montant) { throw new IllegalStateException(); } fromAccount.setBalance(fromAccount.getBalance() - montant); toAccount.setBalance(toAccount.getBalance() + montant); référentiel.save(fromAccount); référentiel.save(toAccount); // Enregistrez également du, au, le montant et l'heure dans une table de transactions } }
Maintenant, mon problème est la concurrence lorsque plusieurs demandes de ce type arrivent ? Comment y remédier pour éviter des données incohérentes. Le ReadCommit par défaut convient-il ici ? Je pense que seul Serialisable résoudra probablement le problème ici, mais je ne suis pas tout à fait sûr, ou devrais-je simplement utiliser des verrous manuels en lecture-écriture Java ici pour des raisons de cohérence ?
Ma principale préoccupation est de savoir ce qui se passe si je lis fromBalance et qu’il était supérieur au montant, mais entre-temps, je le mettais à jour, une autre demande l’a réduit, maintenant je serai dans un état incohérent et je devrais en fait lever une exception.
Je pourrais même avoir une nouvelle requête complète pour simplement getBalance() mais je ne pense pas que cela soit très important, le principal problème est de faire fonctionner correctement createTransaction.
#postgresql #Niveau #disolation #des #transactions #pour #déplacer #largent
1712344592