【问题标题】:With PHP and MySQL, should you check for rollback failures?使用 PHP 和 MySQL,您应该检查回滚失败吗?
【发布时间】:2012-08-19 11:45:59
【问题描述】:

我正在使用 PHP 的 mysqli 库。数据库插入和更新总是在一个 try-catch 块中。立即检查每个查询是否成功(if $result === false),任何失败都会引发异常。 catch 调用 mysqli_rollback() 并退出并为用户发送一条消息。

我的问题是,我应该检查mysqli_rollback() 的返回值吗?如果是这样,并且回滚失败,代码应该采取什么行动?

我很难理解回滚是如何失败的(除非 MySQL 中有一些严重的错误)。而且由于 PHP 无论如何都会退出,调用回滚几乎是多余的。我当然认为它应该在代码中清楚起见,但是当 PHP 退出时,它会关闭与 MySQL 的连接,并且未提交的事务会自动回滚。

【问题讨论】:

  • 如果您正在寻找具有现实概率的具体示例-您的 php 可能在与数据库运行的机器不同的机器上执行(例如,单独的数据库服务器)。网络 io 有很多“现在可以工作,但下一秒就不能工作”的场景。当然,这也可能发生在同一台机器上,只是可能性要小得多。
  • 有趣!不过,在这种情况下,含义似乎是相同的:即使回滚调用失败,PHP 的 MySQL 客户端会话也会结束并发生回滚。因此,也许值得将错误记录为更大问题的指标,但您仍然不必担心数据完整性。

标签: php mysql transactions innodb


【解决方案1】:

mysqli_rollback 如果您没有(从未)连接到数据库,则可能会失败。取决于您事先的错误处理。

【讨论】:

    【解决方案2】:

    如果回滚失败(例如连接失败),无论如何都会在连接关闭后回滚更改,因此您无需处理错误。当你在事务中时,除非你有显式提交(或者你在自动提交模式下运行,这意味着你在每个语句之后都有提交),否则事务正在回滚。

    如果禁用自动提交的会话没有明确结束 提交最后一个事务,MySQL 回滚该事务。

    您想要处理回滚错误的唯一情况是您没有退出脚本,而是稍后启动新事务,因为启动事务将隐式提交当前事务。查看Statements That Cause an Implicit Commit

    【讨论】:

    猜你喜欢
    • 2012-03-04
    • 2015-11-25
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    相关资源
    最近更新 更多