Bonjour,
Dans une application métier développée par java/javascript, nous avons une fonctionnalité qui permet d'annuler un ticket déjà créé (un ticket ici représente un droit d'achat dont le montant est soustrait du solde client). Donc l'annulation d'un ticket, quand elle est acceptée, rétablit le solde client avec le montant du ticket qui a été déjà soustrait.
Le problème c'est que pour des raisons de lenteur réseau, il se trouve que l'utilisateur clique sur le bouton annuler plusieurs fois et donc la requete d'annulation est envoyée plusieurs fois.
Ces requêtes multiples d'annulation (processus), sur le même ticket, passent sans problème (selon comment c'est développé aujourd'hui) et font que le solde du client est rétabli plusieurs fois ce qui lui donne plus de ce qu'il doit. Exemple: si on annule un ticket de 100 euros alors qu'on arrive à cliquer 3 fois sur le bouton annuler (sachant que le bouton annuler doit disparaître de l'écran dès le premier clique) alors le solde du client est augmenté de 3 x 100 euros au lieu de 100 euros.
Est ce que vous avez une idée de comment on peut verrouiller ce traitement de telle sorte qu'un seul process annulation puisse être exécuté?
Voici en bas la procédure stockée Oracle appelée lors du clique sur le bouton annuler d'un ticket donné. Le p_num_bordereau est l'identifiant d'un ticket.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 Procedure annuler_ticket(p_num_bordereau IN VARCHAR2, NMES OUT NUMBER, LMES OUT VARCHAR2) Is V_ID_BORDEREAU NUMBER; v_montant Number; v_id_client number; Begin SELECT a.id_bordereau, montant, id_client INTO v_id_bordereau, v_montant, v_id_client FROM chm.OPERATIONS a AND a.numero_bordereau = p_num_bordereau; -- DELETE FROM chm.operations WHERE id_bordereau = v_id_bordereau; -- Update chm.soldes set solde = solde + v_montant where id_client = v_id_client; -- nmes := 0; lmes := 'OK'; Exception When Others then nmes := 1; lmes := 'Ligne inexistante'; End;
Partager