2010-10-25 13 views
1

Si je lance le PHP suivant, je me attends pas de valeur à insérer dans la table de test, parce que j'ai une transaction que je ne l'ai pas commis:En PHP, puis-je obtenir MySQL pour annuler une transaction si je me déconnecte sans valider, plutôt que de le valider?

$db = mysql_connect("localhost","test","test"); 
mysql_select_db("test"); 
mysql_query("begin transaction;"); 
mysql_query("insert into Test values (1);") or die("insert error: ". mysql_errror()); 
die('Data should not be commited\n'); 
mysql_query("commit;"); // never occurs because of the die() 

Mais au lieu il semble engager de toute façon. Est-il possible de désactiver ce comportement sans désactiver la validation automatique pour PHP qui n'utilise pas de transactions ailleurs sur le site?

Edit: C'était juste une faute de frappe. Cela devrait être "commencer la transaction" ou "commencer". Pas "commencer la transaction". Désolé de perdre le temps des gens.

+0

Sur mon installation de MySQL, la requête « BEGIN TRANSACTION » donne l'erreur « Vous avez une erreur dans votre syntaxe SQL; vérifier le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de 'transaction' à la ligne 1 " – mellowsoon

Répondre

2

Utilisez mysql_query ('BEGIN'). Le SQL "BEGIN TRANSACTION" n'est pas valide (et en fait mysql_query retourne false sur cette requête, ce qui signifie qu'il y a une erreur). Cela ne fonctionne pas parce que vous ne commencez jamais une transaction.

+0

Oups! Je voulais dire "commencer la transaction", pas "commencer la transaction", et quand je répare que cela fonctionne. – rjmunro

+0

C'est * toujours * quelque chose de simple. :) – mellowsoon

1

La syntaxe pour démarrer une transaction est:

START TRANSACTION 

La fonctionnalité que vous parlez est AUTOCOMMIT. Si vous ne voulez pas, vous devrez le désactiver:

SET autocommit = 0 

La référence se trouve à http://dev.mysql.com/doc/refman/5.1/en/commit.html

Je vous recommande également de tester la valeur de retour de tous mysql _... () les fonctions. Vous ne pouvez pas supposer qu'ils fonctionneront toujours avec succès.

+0

Ouais. Dans le code de production, je teste la valeur de retour des fonctions mysql, mais il s'agissait juste d'un script de test idiot pour prouver à un collègue que pour utiliser des transactions, il ne serait pas nécessaire de passer par le code et d'ajouter des centaines Erreur. Les instructions de die existantes feraient l'affaire. – rjmunro

0

Par défaut, la transaction ne sera pas annulée. Il est de la responsabilité de votre code d'application de décider comment gérer cette erreur, que ce soit en train de réessayer ou de revenir en arrière.

Si vous voulez rollback automatique, qui est également expliqué dans le manuel:

The current transaction is not rolled back. To have the entire transaction roll back, start the server with the `--innodb_rollback_on_timeout` option.