Bonjour à tous,
Je suis dans une entreprise du web, j'écris des procédures stockées t-sql qui servent de web services et qui sont donc appelées par un grand nombre de clients simultanément.
Je rencontre un problème de concurrence d'appel à un de mes web services: on doit l'appeler plusieurs fois avec la même variable @nouveau_id, mais a des fins statistiques je ne veux l'enregistrer qu'une fois en table
Il contient la simple instruction :
Je pensais de cette manière être tranquille et être sûr que je n'aurais jamais d'insertion double de clé primaire, pourtant j'ai régulièrement des erreurs à l'insertion pour violation de clé primaire. La seule explication que j'ai trouvée est des appels simultanés de mon web service.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 insert into ma_table(id, date) /* avec id primary key sur ma_table */ select distinct @nouveau_id, getdate() from ma_table where @nouveau_id is not null and not exists ( select id from ma_table where id = @nouveau_id)
J'ai essayé de jouer avec les niveaux d'isolation (j'ai à peu près tout essayé), mais rien n'a changé, j'ai toujours des tentatives d'insertion double.
Je voulais savoir s'il y avait un moyen de poser manuellement un verrou sur la table, pour entourer mon instruction SQL et être sûr de ne pas avoir de concurrence du tout.
Sinon, y a t'il un autre moyen d'éviter ce problème?
En vous remerciant, Thomas
Partager