Powerbuilder pour les completement Geeks !

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.

#1 09-01-2007 12:08:53

digital prophecy  
Membre Geek
Date d'inscription: 29-05-2006
Messages: 55
Pépites: 310
Banque: 0

Une transaction qui n'est pas atomique

Bonjour,

Dans mon application j'ai une table "Sequence" qui regroupe tous les noms de mes tables et un champ sequence qui donne le dernière séquence de ma clé primaire. Cette table est mise à jour par la procédure stockée ci-dessous, qui selectionne la sequence, l'incrémente de 1 et retourne la valeur comme clé primaire dans un nouvel enregistrment de la table correspondante. La procédure fonctionne très bien, mais l'ennui est que des fois, les séquences prennent du retard dans la table "Sequence" par rapport à certaines autres tables. ex sequence = 8 dans la table sequence alorsque dans la table Variations la séquence est à 9. ça veut dire que des fois il sélectionne bien, mais ne met pas à jour la table sequence (ce qui est annormal, pck j'ai mis tout dans une transaction). Et cette situation me provoque chaque fois des violations de contrainte de clé primaire. Quelqu'un peut-il m'aider à résoudre ce pbm ?

Procédure stockée

Code:

 PROCEDURE dbo.GetSequence
(
   @tablename varchar(255)
)
AS

DECLARE @CurrentValue int


BEGIN TRANSACTION LaTransaction

SET @CurrentValue = (SELECT ncurrentvalue FROM Tsequence WHERE ltablename = @Tablename);

SET @CurrentValue = @CurrentValue + 1;

UPDATE Tsequence SET ncurrentvalue = ncurrentvalue + 1 WHERE ltablename = @Tablename
SELECT @CurrentValue;

IF @@ERROR <> 0
    ROLLBACK TRANSACTION LaTransaction;
ELSE
    COMMIT TRANSACTION LaTransaction;

Appel de la procédure stockée

Code:

//Ceci est le code d'une procédure de ma DWControle parente d'où héritent toutes mes autres DWControles
//La procédure est appelée à chaque insertion d'un nouvel enregistrement.

DECLARE proc_GetSequence PROCEDURE FOR dbo.GetSequence
@tablename = :is_tablename; //variable d'instance contenant le nom de la table
EXECUTE  proc_GetSequence;

    FETCH proc_GetSequence INTO :ll_currentvalue;

    ls_err    = sqlca.sqlerrtext
    CLOSE proc_GetSequence ;
   
     if SQLCA.sqlcode <> 0 THEN     
        messagebox("Erreur",ls_err)
    END IF
    
CLOSE proc_GetSequence ;

 return ll_currentvalue

Hors ligne

 

#2 09-01-2007 12:26:20

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: Une transaction qui n'est pas atomique

Bonjour,

Même si ça ne réponds pas à ta question, habituellement, le n° de séquence n'est incrémenté qu'une fois que la nouvelle ligne a bien été enregistrée, au cas où il y aurait annulation de la saisie ou tout autre problème d'enregistrement dans la base.

Pour info tu utilises quel SGBDR ? Ne serait-il pas mieux de lui laisser gérer cette tâche (PK autoincrement pour Sybase, sequence pour Oracle,...) ?


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#3 09-01-2007 12:36:39

digital prophecy  
Membre Geek
Date d'inscription: 29-05-2006
Messages: 55
Pépites: 310
Banque: 0

Re: Une transaction qui n'est pas atomique

Merci beaucoup pour ta réponse,

J'utilise MS SQL Server 2000. Je n'utilise pas les autoincrément de la base pck j'ai besoin de contrôler la suite de mes séquences. C'est une bonne idée que d'appeller la séquence à l'enregistrement. Mais le problème n'est certainement pas du au fait que je fais appel à ma procédure à l'insertion.

Merci beaucoup !

Hors ligne

 

#4 09-01-2007 12:52:10

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: Une transaction qui n'est pas atomique

Certes, peut-être un point-virgule à la fin de

Code:

UPDATE Tsequence SET ncurrentvalue = ncurrentvalue + 1 WHERE ltablename = @Tablename

??


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22