-
Pb double sur un insert
bonjour à tous,
J'ai le pb suivant avec cette instruction que j'exécute dans un DTS :
insert into t_jrn_industrialisation (id_jrn, tra_app_nom, div_nom, tra_code, jrn_dt_debut,jrn_result)
select isnull(max(id_jrn),0) +1,@appnom,@divnom,@tracode,getdate(),'KO' from t_jrn_industrialisation
Je veux créer un record avec un ID_JRN + 1 à chaque passage mais malgré les verroux d'Insert, il me crée des doublons.
Que puis je rajouter dans ma transaction en terme de code d'isolation ou de verrouillage?
mERCI
-
salut,
pourquoi tu ne déclares pas pour ta table destination t_jrn_industrialisation, un champ autoincrémenté pour ton champ id_jrn ?
Cordialement,
Jo
-
Le mode de calcul du suivant (MAX(...) +1)ne peut que générer des problèmes. Soit vous passez en mode d'isoaltion sérializable avec toutes les conséquence que cela induit (blocages, verrous mortels...) et votre numérotation sera bonne, soit vous externalisez votre incrémentation par une routine (proc ou function), comme je l'ai indiqué dans cet article :
http://sqlpro.developpez.com/cours/clefs/
A +
-
Pb double sur un insert
j'ai mis en place cette solution
- Implementation dans ma procédure stockée
CREATE PROCEDURE sp_u_V1_INIT_JRN(@appnom as varchar(6), @divnom as varchar(3), @tracode as varchar(2))
AS
begin
begin transaction
insert into t_jrn_industrialisation (id_jrn, tra_app_nom, div_nom, tra_code, jrn_dt_debut,jrn_result)
select isnull(max(id_jrn),0) +1,@appnom,@divnom,@tracode,getdate(),'KO' from t_jrn_industrialisation
commit
end
GO
je ne suis pas convaincu que ce mode de fonctionnement régle mon problème mais lorsque je l'éxécute 2 fois dans l'analyseur et sans commit , la 2éme attend bien jusqu'à ce que je passe le commit de la 1ere.
Merci à tous