【问题标题】:How to make sure two MySQL queries are successful?如何确保两个 MySQL 查询成功?
【发布时间】:2011-08-08 14:36:17
【问题描述】:

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

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

我正在使用 MyISAM,但我知道我无法进行回滚等操作,但有什么办法可以克服我的问题(另一种解决方案)来做我想做的事吗?

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

【问题讨论】:

  • 如果您希望符合 ACID,那么您应该使用符合 ACID 的存储引擎(即 InnoDB)。没有办法解决这个问题。如果您的第二个查询失败,那么第一条记录的删除也可能会失败......因此,如果不实际使用事务,就无法强制执行此操作。

标签: php mysql insert


【解决方案1】:

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

【讨论】:

  • 嗨,我可以将两个表都更改为 InnoDB,但我不知道也从未做过回滚或任何事情,所以不确定语法是什么样的。谢谢 PHPLOVER
  • 有很多关于MySQL事务的教程,例如dev.mysql.com/doc/refman/5.0/en/commit.html我强烈建议你这样做,你学会如何使用它就会经常使用它。
【解决方案2】:

第一次插入后,可以使用mysql_insert_id()获取ID并存储。

然后,当您执行第二个查询时,也获取该 ID。如果 ID 为空,则表示它不成功,并且您已获得旧 ID,因此您可以将其删除,就像这样

DELETE FROM table WHERE id='$insertId'

编辑:

请注意,这不是一个完整的解决方案,唯一真正的方法是转换为 InnoDB

【讨论】:

  • 如果删除失败并且数据保留在链接两个条目的表中?然后会发生什么?
  • 除非将表转换为 InnoDB,否则不会有完美的解决方案
  • 没错,这就是为什么您的解决方案充其量只是部分解决方案。不要误会我的意思,我只是认为您应该指出所有可能的结果以及答案,以免有人误解。
  • 嗯,它不仅限于 InnoDB(尽管它是最明显的选择),任何事务存储引擎都可以(InnoDB、NDB、Falcon、XtraDB,...)。
【解决方案3】:

听起来你需要交易。

http://www.techrepublic.com/article/implement-mysql-based-transactions-with-a-new-set-of-php-extensions/6085922

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

【讨论】:

  • @Johan,我知道他有什么,我在说明他应该使用的最佳工具。他可能也可以只用一把锤子建立一个套牌,但这并不正确。
  • 您的建议是正确的,但是您没有指定事务仅适用于 InnoDB,OP 知道 MyISAM 无法进行事务,因此它确实不是问题的答案。就像我在问how do I catch a chicken 而你告诉我吃水果,因为它不会跑掉。
  • 当然他需要事务,但是他也必须改变使用的存储引擎,因为 MyISAM 是非事务性的......@Johan 事务不仅限于 InnoDB,还有更多事务性存储用于 MySQL 的引擎(Falcon、NDB、XtraDB 以及未来可能的 Aria)。
  • 是的,是的,我知道事务与许多引擎一起工作,但不是 MyISAM。很抱歉在评论中偷工减料。
  • @maple_shaft 谢谢我们会调查交易谢谢大家的帮助:)
【解决方案4】:

交易答案。如果您选择的存储引擎不支持它们,并且您遇到这种情况,那么您可能选择了错误的存储引擎。

【讨论】:

    猜你喜欢
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    • 2018-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多