2012-03-21 63 views
1

基本上,我插入到关系型MySQL数据库使用MYISAM排序规则与PHP。例如,如果用户填写了Web表单并将其张贴以供插入,则它们提供的所有数据可能都属于多个表格的一部分。mysql撤消查询或功能

所以使用PHP,我会值插入到一个表,然后到另一个,然后到另一个,等等等等......

但说我3把插入大量的数据为3个表,但在第4插入... sql失败...然后我需要向用户返回一条错误消息,但是也必须撤消所有最后一个插入。

我可以简单地只删除失败的所有过去的刀片...

不过,我想知道是否有更简单的方法?

以某种方式将sql查询提供给临时存储数据和SQL的mysql引擎,并在命令上运行所有语句?

任何想法?

回答

5

开始:

mysql_query("start transaction"); 

然后,如果你所有的刀片的成功工作:

mysql_query("commit"); 

否则,如果有一个失败的地方......

mysql_query("rollback"); 

完成^ _ ^我喜欢这个功能。编辑(注释如下):这只适用于支持事务的数据库引擎,MyISAM不是其中之一。我强烈推荐InnoDB,因为它支持行级锁定,使您的查询不太可能遇到锁定问题。

+1

MyISAM不支持交易,数据库将不得不转换为InnoDB或类似。但我同意,这是解决方案。 – 2012-03-21 09:40:26

+0

真的吗?哇,这很糟糕......我使用InnoDB进行行级锁定是件好事:D我将用该信息编辑我的答案。 – 2012-03-21 09:44:34

+0

所以在我使用mysql_query("start transaction");之后,所有的php mysql_ *函数都能正常工作,直到我使用mysql_query("commit");? – 2012-03-21 09:45:43

1

尝试使用SET AUTOCOMMIT = 0禁止autocommiting

而且实现,则必须使用支持InnoDB表

通知最近的MySQL版本当你这样做,你需要总是使用提交保存更改...

START TRANSACTION; 
UPDATE table SET summmary='whatever' WHERE type=1; 
COMMIT; 

PHP 确实支持事务,使用单独的查询语句的每个命令

mysql_query("BEGIN"); 
mysql_query("COMMIT"); 
mysql_query("ROLLBACK"); 
0

朋友, 如果你想之后的任何失败步骤做回滚不能使用MyISAM存储引擎.. 。如果你可以使用InnoDB作为你的mysql存储引擎,那么我可以回答你在这里提出的问题...不仅如此,我可以说你必须在php中编写,用于mysql,并且可以共享一些将清除的示例代码你的概念,那么你会很容易......但是首先你必须确认我,你可以改变你的表存储引擎到InnoDB ......?如果你想改变,但不知道你怎么能改变你的存储引擎,那么你应该随时问我...我会尽我所能...

如果你想问我什么只是编辑这个回答并添加你问题的最后一个...即使你也可以添加评论... 祝你好运...朋友...

+0

有一个类似于你的帖子... http://stackoverflow.com/a/10041889/1278128 – 2012-04-06 14:54:40