Php 如何确保两个MySQL查询成功?

Php 如何确保两个MySQL查询成功?,php,mysql,insert,Php,Mysql,Insert,我的PHP代码中有两个MySQL查询 基本上,我需要两个查询来执行(它们是两个INSERT)查询,并且两个查询都必须成功。例如,如果查询1成功,但查询2不成功;我需要回滚查询1,因为两个查询都必须成功 我正在使用MyISAM,我知道我不能执行回滚等操作,但是有没有办法克服我的问题(另一种解决方案)来做我想做的事情 它们都相互依赖,因为query1存储表单中的数据,query2将一些其他详细信息插入另一个表(基本上是一个计数器),该表跟踪转诊系统的总计数。一个选项是将插入记录的ID存储在第一个表中

我的PHP代码中有两个MySQL查询

基本上,我需要两个查询来执行(它们是两个INSERT)查询,并且两个查询都必须成功。例如,如果查询1成功,但查询2不成功;我需要回滚查询1,因为两个查询都必须成功

我正在使用MyISAM,我知道我不能执行回滚等操作,但是有没有办法克服我的问题(另一种解决方案)来做我想做的事情


它们都相互依赖,因为query1存储表单中的数据,query2将一些其他详细信息插入另一个表(基本上是一个计数器),该表跟踪转诊系统的总计数。

一个选项是将插入记录的ID存储在第一个表中。如果第二个查询失败,请使用删除查询删除第一个查询插入的记录。
不过,我建议您将引擎更改为InnoDB,这样您就可以使用事务。或者您是否有使用MyISAM(如全文搜索)的特定原因?

听起来您需要交易


它们允许您在单个事务中回滚整个系列的数据库修改。

第一次插入后,您可以使用获取ID并将其存储

然后,在执行第二个查询时,也要获取该ID。如果ID为null,则意味着它没有成功,并且您已经获得了旧ID,因此可以删除它,就像这样

DELETE FROM table WHERE id='$insertId'
编辑:


请注意,这不是一个完整的解决方案,唯一正确的方法是将其转换为InnoDB。答案是事务。如果您选择的存储引擎不支持它们,并且您有这种情况,那么您可能选择了错误的存储引擎。

您好,我可以将两个表都更改为InnoDB,但我不知道,也从未执行过回滚或其他操作,因此不确定语法是什么。感谢PHPLOVERT这里有很多关于MySQL事务的教程,例如,我强烈建议您这样做,在您学习如何使用它之后,您将经常使用它。如果您想要符合ACID,那么您应该使用符合ACID的存储引擎(即InnoDB)。这是没办法的。如果第二次查询失败,那么删除第一条记录也可能失败。。。因此,如果不实际使用事务,就无法强制执行此操作。如果删除失败,并且数据仍保留在链接这两个条目的表中?那么会发生什么呢?除非这些表被转换成InnodBquick,否则就不会有完美的解决方案,这就是为什么您的解决方案充其量只能是部分解决方案的原因。别误会我的意思,我只是认为你应该指出所有可能的结果以及答案,这样就不会有人产生错误的想法。好吧,它不仅限于InnoDB(尽管它是最明显的选择),任何事务存储引擎都可以(InnoDB、NDB、Falcon、XtraDB等)。@Johan,我知道他有什么,我在说明他应该使用的最佳工具。他可能也可以用锤子来构建一副牌,但这并不正确。你的建议是正确的,但是你没有指定事务只能与InnoDB一起工作,OP知道MyISAM不能进行事务,因此这并不是问题的答案。这就像我在问
我如何抓到一只鸡
,而你却告诉我吃水果,因为它不会跑掉。他当然需要事务,但他还必须更改使用的存储引擎,因为MyISAM是非事务性的@Johan事务不仅限于InnoDB,MySQL还有更多的事务存储引擎(Falcon、NDB、XtraDB,将来可能还有Aria)。是的,我知道事务可以使用很多引擎,只是MyISAM不行。很抱歉在评论中偷工减料。@maple_shaft感谢将调查交易感谢所有人的帮助:)