2015-11-04 2 views
0

J'ai une procédure stockée qui lit l'ID d'une ligne avec l'état x, puis définit immédiatement cet ID de lignes à l'état y.Procédure stockée SQL en attente et en exécution séquentielle

Étant donné que cette procédure stockée est appelée par plusieurs applications clientes, les mêmes valeurs sont renvoyées alors qu'en réalité, les 2 exécutions ne devraient pas en trouver dans le statut x.

Je n'utilise rien d'autre que d'encapsuler les actions dans une transaction begin/commit.

exemple rugueux:

Begin Transaction 
IF (@Param = '2') -- all 
    BEGIN 
     @resultID = (SELECT ... WHERE STATUS_ID = X 
    END 
ELSE 
    BEGIN 
     @resultID = (SELECT ... WHERE STATUS_ID = X 
    END 
IF (@ResultID > 0) 
    BEGIN 
     UPDATE JOB_QUEUE SET STATUS_ID = Y WHERE ID = @ResultID 
    END 
COMMIT 
SELECT * from JOB_QUEUE WHERE ID = @ResultID 

D'une certaine façon la requête a retourné la même @resultID de la table .. donc je présume que je besoin d'un peu de verrouillage ou de quelque chose pour empêcher cela.

Existe-t-il une méthode pour s'assurer que les exécutions de la procédure stockée entraînent simultanément l'exécution de l'une, puis de l'autre (séquentiellement)?

Merci.

+1

Tag dbms produit utilisé. (Ne ressemble pas à ANSI SQL ...) – jarlh

+0

Quel RDBMS est-ce? Veuillez ajouter une balise pour spécifier si vous utilisez 'mysql',' postgresql', 'sql-server',' oracle' ou 'db2' - ou autre chose entièrement. –

+0

HI c'est pour le serveur SQL –

Répondre

0

La réponse simple est d'accélérer le processus entier - si c'est une requête à exécution lente, alors la sélection peut s'exécuter avant la fin de la mise à jour.

Si vous devez sélectionner les valeurs pour un autre rapport, vous pouvez effectivement exécuter la mise à jour comme la première déclaration, et utiliser le mot-clé OUTPUT pour retourner les ID des enregistrements mis à jour par exemple:

UPDATE JOB_QUEUE 
SET STATUS_ID = Y WHERE STATUS_ID = X 
OUTPUT inserted.ID 
+0

J'ai besoin de récupérer un identifiant basé sur des paramètres (change la clause where), puis de mettre à jour cet identifiant d'enregistrement, et de retourner la ligne entière. –

+0

Je pense que vous avez raison, le select semble être exécuté avant la mise à jour. C'est pourquoi je cherche à contenir tous les autres hits sur le proc stocké jusqu'à ce qu'une seule exécution soit terminée. –