2010-10-25 116 views
1

如果我运行下面的PHP,我希望没有价值被插入到测试表,因为我有我还没有提交的事务:在PHP中,如果我断开而不提交,而不是提交,我可以让MySQL回滚事务吗?

$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() 

但相反,它似乎继续提交。有没有办法关闭这种行为,而不关闭自动提交的PHP不使用网站上其他地方的交易?

编辑:这只是一个愚蠢的错字。它应该是“开始交易”或“开始”。不是“开始交易”。对不起,浪费人们的时间。

+0

在我安装MySQL的,查询“BEGIN TRANSACTION”给出了错误“您的SQL语法错误;检查对应于您的MySQL服务器版本的手册,以便在第1行'transaction'附近使用正确的语法“ – mellowsoon 2010-10-25 16:10:03

回答

2

使用mysql_query('BEGIN')。 SQL“BEGIN TRANSACTION”无效(实际上mysql_query在该查询中返回false,这意味着有错误)。它不工作,因为你永远不会开始交易。

+0

哎呀!我的意思是输入“开始交易”,而不是“开始交易”,当我修复它的工作。 – rjmunro 2010-10-25 16:09:49

+0

它总是*很简单。 :) – mellowsoon 2010-10-25 16:10:49

1

的语法开始交易:

START TRANSACTION 

和你谈话的功能有关 AUTOCOMMIT。如果你不想要的话,你就必须禁用它:

SET autocommit = 0 

参考可以在http://dev.mysql.com/doc/refman/5.1/en/commit.html

发现我也建议您测试所有的MySQL的返回值_...( ) 功能。你不能认为他们会一直运行成功。

+0

是的。在生产代码中,我测试了mysql函数的返回值,但这只是一个愚蠢的测试脚本,可以推向一个使用事务的同事,我们不需要通过代码并在任何地方添加数百个回滚语句错误。现有的死亡陈述将会诀窍。 – rjmunro 2010-10-25 16:22:16

0

默认情况下,事务不会回滚。应用程序代码负责决定如何处理此错误,无论是重试还是回滚。

如果你想自动回滚,这也是该手册中解释说:

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