Concurrence d'appel d'une instruction SQL
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 :
Code:
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) |
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.
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