3 votes

Expression SQL SUM et verrouillage

J'ai un problème avec la bonne solution SQL.

Situation actuelle : Ma base de données contient une table avec des transactions bancaires (crédit et débit).

  • Les transactions de crédit sont signées comme un montant positif (+), et
  • les transactions de débit comme un montant négatif (-).

L'application qui utilise la base de données est une application web multi-utilisateurs, donc la table des transactions contient de nombreuses lignes, qui font référence à différents utilisateurs. Certaines actions de la webapp doivent vérifier le solde réel de l'utilisateur connecté, en utilisant la table des transactions et en enregistrant la transaction de débit (prix de l'action).

Je pense à l'architecture de ce mécanisme et j'ai quelques questions :

  1. Est-ce une bonne idée de calculer le solde comme une SOMME des crédits et des débits des transactions à chaque demande de l'utilisateur ? Je sais que cela peut être inefficace pour la base de données. Peut-être devrais-je sauvegarder un instantané quelque part ?

  2. Comment assurer la cohésion des données lorsqu'un utilisateur vérifie le ""solde"" en tant que SOMME des transactions de crédit/débit, et qu'un autre utilisateur enregistre en même temps la transaction de débit (parce qu'il/elle a été plus rapide) ? Je pense à un verrou pessimiste mais qu'est-ce que je devrais verrouiller ? Je sais que le verrouillage avec agrégation (SUM) peut être impossible sur Postgresql (base de données que j'utilise)."

Désolé pour mon anglais, j'espère que mon problème est compréhensible :)

1voto

David Aldridge Points 27624

J'envisagerais l'un ou l'autre :

Enregistrement d'un solde sur l'enregistrement du compte, ainsi que la date pour laquelle le solde est exact.

Pour obtenir le solde actuel, il suffit de lire le solde du compte, puis d'inclure toutes les transactions effectuées depuis cette date.

Vous pouvez avoir une tâche programmée qui recalcule et horodate ce solde à minuit et une heure.

OU (et c'est la solution que je préfère) :

Chaque fois qu'une transaction ou un lot de transactions est chargé, verrouillez les enregistrements de compte pertinents et mettez-les à jour avec les valeurs de l'insertion. dans le cadre de la même transaction .

Cela présente l'avantage de sérier l'accès au compte, ce qui peut ensuite aider à déterminer si une transaction peut être effectuée ou non en raison des décisions basées sur le calcul du solde.

1voto

Edu Points 1192

Si vous voulez éviter d'avoir le solde sur le compte utilisateur, quelque chose qui pourrait avoir une meilleure performance, l'approche que j'expérimenterais serait :

  • Chaque transaction ne serait liée qu'à un seul compte.
  • Chaque transaction aurait le solde du compte après cette transaction.

Par conséquent, la dernière transaction pour ce compte aura le solde actuel.

Ex.. :

TransactionId | AccountId | Datetime | Ammount | Balance 
            1 |         1 | 7/11/16  |       0 |       0 
            2 |         1 | 7/11/16  |     500 |     500 
            3 |         1 | 7/11/16  |     -20 |     480 
            4 |         1 | 8/11/16  |      50 |     530 
            5 |         1 | 8/11/16  |    -200 |     330 

De cette façon, vous serez en mesure d'obtenir le solde du compte (dernière transaction avec cet accountId) et vous serez en mesure de fournir une meilleure vue de l'évolution du solde dans le temps.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X