2017-04-25 1 views
0

Bonsoir,Double INSERT utilisant un post-échange TRANSACTION

Je souhaite créer une TRANSACTION avec le niveau d'isolement approprié. Sur cette transaction, je veux faire une double insertion et si l'une échoue, l'autre est abandonnée.

J'ai une procédure stockée déjà créé:

create or replace function insert_into_answercomments(userid INTEGER, answerid INTEGER, body text) 
    returns void language plpgsql as $$ 
DECLARE result INTEGER; 
    insert into publications(body, userid) 
    VALUES (body, userid) 
    returning publications.publicationid AS publicationid INTO result; 

    insert into comments(publicationid) VALUES (result); 

    insert into answercomments(commentid, answerid) VALUES (result, answerid); 
end $$; 

Mon doute est de savoir si la transaction doit être à l'intérieur de la fonction ou si elle est une procédure différente. Comment puis-je le créer avec un niveau d'isolation correct.

Cordialement

Répondre

1
transaction

ne peut pas être démarré/terminé dans la fonction postgres. Si vous voulez de la logique, faites-en la fonction. Dans votre cas, vous n'avez besoin de rien - si la première insertion génère une exception, la transaction s'interrompt. Mais si vous avez besoin de vérifier sophistiqué, faire droit dans le code, par exemple

if result > 90 then 
    insert ...second insert 
end if; 

pour exécuter la fonction dans la transaction démarrer à l'extérieur, par exemple:

begin; 
select * from insert_into_answercomments(1,2); 
end; 
+0

Mais comment pourrais-je appeler cette transaction? À chaque fois que je devais faire ces doubles inserts, comment j'appellerais la transaction si ce n'est pas une procédure? –

+0

'' 'commencer; select * from insert_into_answercomments (1,2); fin; '' ' –

+0

Merci. Qu'en est-il du niveau d'isolement? Avez-vous une idée quel est le niveau? Comment puis-je le déclarer? –