Bonjour,
Je souhaiterais savoir comment faire une transaction MySQL.
J'ai pas mal cherché sur le web mais rien ne fonctionne.
Il faut utiliser COMMIT et ROOLBACK.
merci d'avance![]()
Bonjour,
Je souhaiterais savoir comment faire une transaction MySQL.
J'ai pas mal cherché sur le web mais rien ne fonctionne.
Il faut utiliser COMMIT et ROOLBACK.
merci d'avance![]()
La documentation est pourtant simple :
http://dev.mysql.com/doc/refman/5.0/fr/commit.html
Quel probleme rencontres-tu ?
Merci pour le tuto mais je n'arrive pas à l'intégrer voici mon code :
Puis-je avoir un exemple ? merci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 $insertion = "INSERT INTO materiel VALUES ('' , 'ordinateur');"; $result = mysql_query($insertion); if ($result == TRUE) { echo 'valider les changement dans la base de données'; }else{ echo 'annuler les changement dans la base de données'; }![]()
Je ne vois rien dans votre code qui reprenne l'exemple de transaction que je vous ai donné.
Pensez juste bien que mysql_query() traite une seule requete a la fois et donc qu'il faut ecrire chaque instruction de la transaction dans un mysql_query() different.
Par contre pour suivre la logique de ce que vous avez ecris, dans le cas ou mysql_query() renvoit FALSE, il n'y aurait rien a annuler puisque la requete n'aurait pas été traité.
Je ne savais pas que l'on devais recommencer une transaction après chaque requête merci de me l'avoir dit
Dans mon cas je fais plusieurs insertions et si une se passe mal, j'annule toutes celles déjà faites.
Je ne vois pas trop comment faire ça avec "mysql_query()" avez-vous une solution niveau code merci.![]()
J'ajouterai que les transaction seront utilisées quand les requetes SQL se sont executé sans erreur. De plus les transactions seront interressante dans le cas de plusieurs operations atomiques DML
exemple de transaction bancaire d'un compte A vers un compte B
Le but c'est d'assurer que le transfers d'argent se fasse normalement
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 mysql_query("start transaction"); mysql_query("Soustraire 100 euro du compte A"); // pseudo requete mysql_query("Ajouter 100 euro au compte B"); // pseudo requete mysq_query("commit"); // enregister les changement
Merci buggen25 je commence a me rendre compte que les transactions ne sont pas adaptés à mon cas.
Comment puis-je faire alors pour annuler toutes les insertions que j'ai faites dans la base de données si une à eu un problème ?
merci![]()
Je n'ai pas dit ca : mysql_query() ne peut traiter qu'une requete a la fois, donc il faut executer chaque requete de ta transaction avec un mysql_query() different.Je ne savais pas que l'on devais recommencer une transaction après chaque requête merci de me l'avoir dit
ok j'avais pas tout compris désolé
Au niveau code comment ce traduit ma question :
Comment puis-je faire alors pour annuler toutes les insertions que j'ai faites dans la base de données si une à eu un problème ?
Merci![]()
salut,
l'instruction commit valide les requetes faites depuis l'ancien commit...
ainsi, si une transaction est correct, vous pouvez la valider avec le commit (comme l'a suggere buggen25)
et si une requete n'est pas correcte, vous pouvez utiliser le rollback qui ne validera pas les requetes faites depuis l'ancien commit.
il faut faire attention avec les rollback ca peu etre, d'autres utilisateurs auront fait des requetes entre temps...
La forme des pyramides prouve que l'Homme a toujours tendance a en faire de moins en moins.
Venez discuter sur le Chat de Développez !
Devineavec les transactions, sous reserve de ne pas utiliser une clé de type auoincrement. il faut créer une fonction php ( je ne sais pas comment faire une fonction en php )
sans oublier que les tables de type MYISAM ne sont pas transactionnelles, par defaut mysql utilise le moteur InnoDB qui est transactionnel
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 mysql_query("START TRANSACTION"); $result = mysql_query($insertion); if ($result == FALSE) { mysql_query("ROLLBACK"); return; // retourner de la fonction } $result = mysql_query($insertion2); if ($result == FALSE) { mysql_query("ROLLBACK"); return; // retourner de la fonction } ... mysql_query("COMMIT"); // ici on valide les changements
Que se passe t'il si je fais une transaction, qu'un autre utilisateur modifie une valeur et que je fais un rollback ?
Oui il y a un hic
je pense que pour chaque thread (connection utilisateur) est definie une transaction isolée des autres threads, biensur le niveau d'isolation peut etre modifié.
Voir ici :
http://dev.mysql.com/doc/refman/5.0/...isolation.html
Merci à tous ça fonctionne !![]()
Tous vos conseils m'ont bien aidés![]()
Pendant que le thread (ou session utilisateur si on veut) est au milieu de sa transaction, alors les autres threads attendront juqu'a ce qui'il termine, c'est une sorte d'exclusion mutuelle, pour verifier c'est simple,
Mettre dans la variable d'environnement PATH le chemin vers le bin de l'installation mysql(ou easy php),
cmd,
tapper mysql,
Normalement il va afficher mysql> (sinon tapper dans cmd mysql -u root -p et tapper le password)
On crée alors un premier thread,
On en crée un deuxieme
et on teste les transactions, en changeant les niveau d'isolation cité dans :
http://dev.mysql.com/doc/refman/5.0/...isolation.html
Partager