Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/08/2011, 18h18   #1
Nouveau Membre du Club
 
Étudiant
Inscription : mai 2009
Messages : 102
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2009
Messages : 102
Points : 37
Points : 37
Par défaut [MySQL5.5] Transaction contenant une/des procédures stockées

Bonjour,

J'aimerais savoir s'il est possible d'appeler des procédure à l’intérieur d'une transaction comme ci dessous :

Code :
1
2
3
4
5
START TRANSACTION; 
 
call maTransaction();
 
COMMIT;

Il me semble qu'à la sortie de la transaction un commit est réalisé même si après le "start transaction" je fais un "set autocommit = 0"

D'après vos expériences, ce cas d'utilisation est-il possible et si oui recommandé ?

Merci d'avance.
Xploit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 16h22   #2
Membre régulier
 
Inscription : décembre 2008
Messages : 64
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 64
Points : 87
Points : 87
Bonjour,

Citation:
J'aimerais savoir s'il est possible d'appeler des procédure à l’intérieur d'une transaction comme ci dessous :
La réponse est "OUI".
Citation:
Il me semble qu'à la sortie de la transaction un commit est réalisé même si après le "start transaction" je fais un "set autocommit = 0"
Tu ne donnes pas l'exemple qui te fait arriver à cette conclusion mais je pense que tes tests t'ont induit en erreur.

Le mélange de "set autocommit" et START TRANSACTION est confusionnel
En effet, si on fait un set autocommit=0, cela ouvre une transaction, et si ensuite on fait set autocommit=1, la transaction est commitée et fermée.

A mon avis, évite de mélanger les deux.
Voici quelques exemples pour bien comprendre (enfin j'espère)
(ma proc inserenom() insère une ligne dans une table.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
-- la transaction est commitée 
START TRANSACTION;
call test.inserenom('titi01in');
COMMIT;
ROLLBACK; -- pour vérifier on peut faire ROLLBACK qui est sans effet
 
 -- ou 
SET autocommit= 0;
call test.inserenom('titi02in');
SET autocommit= 1; -- (ou COMMIT)
ROLLBACK; -- pour vérifier on peut faire ROLLBACK qui est sans effet
 
 
 
-- la transaction est rejetée
START TRANSACTION;
SET autocommit= 0;
call test.inserenom('titi03out');
ROLLBACK;
COMMIT; -- pour vérifier on peut faire COMMIT qui est sans effet
-- ou 
SET autocommit= 0;
call test.inserenom('titi04out');
ROLLBACK;
COMMIT; -- pour vérifier on peut faire COMMIT qui est sans effet
 
 
-- mais aussi ligne rejetée (le set autocommit = 0 est sans effet:
START TRANSACTION;
SET autocommit= 0;
call test.inserenom('titi05out');
ROLLBACK;
COMMIT; -- pour vérifier on peut faire COMMIT qui est sans effet
 
-- Mais ci dessous la ligne est insérée quand même
-- car SET autocommit= 1; ferme la transaction.
START TRANSACTION;
SET autocommit= 1;
call test.inserenom('titi05in');
ROLLBACK;
ROLLBACK; -- pour vérifier on peut faire un deuxième ROLLBACK qui est sans effet
semaphore1984 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2011, 09h09   #3
Nouveau Membre du Club
 
Étudiant
Inscription : mai 2009
Messages : 102
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2009
Messages : 102
Points : 37
Points : 37
Alors j'ai effectivement placé une petite coquille dans mon code car je voulais plutôt parler d'un appel de procédure stockée dans une transaction.

Code :
1
2
3
4
5
START TRANSACTION
 
call maProcedureStockee();
 
COMMIT
Lors de mes tests de ce principe j'avais lancé une transaction sans faire le COMMIT et j'avais ouvert une deuxieme session sur le server MySQL pour verifier que l'acces à la donnée était bien bloqué. J'avais fait un simple "SELECT" qui attaquait le champ en question.
Ce que j'avais oublié c t de placer mon select dans une transaction. et la j'ai bien mon select qui est mis en attente jusqu'au commit de la premiere session.

Merci semaphore1984 pour tes exemples ça m'a appris des choses ;p

Maintenant j'ai des questions sur le clustering de servers de base de données avec des failover automatiques ... MySQL ne semble pas proposer d'option autre que la replication (pas de failover auto) et le vluser (pas forcément très pratique à l'utilsation et à mettre en place. Mais ceci est un autre sujet ...

Bon week end
Xploit est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h19.


 
 
 
 
Partenaires

Hébergement Web