【发布时间】:2023-02-24 01:18:05
【问题描述】:
假设我是一个 PHP 应用程序,我使用 mysqli_begin_transaction 开始一个 innodb 事务,它返回 true。然后我做了一系列的插入。据我所知 --- 作为一个 PHP 应用程序 --- 所有插入都完美无缺。 (假设我检查了所有可能的错误代码。)据我了解,在我提交之前,整个事务可能会回滚 --- 由于死锁或其他原因。假设在我提交之前我延迟了一段时间做一些与 MySQL 无关的事情。进一步假设 --- 在此延迟期间 --- MySQL 进入必须回滚我的整个事务的情况。我声称我不知道它已回滚,因为此时我没有调用任何 MySQL 过程。 (PHP 中的 MySQL 驱动程序会以某种方式发现并抛出异常吗?我担心它不会,但我不知道。)当我准备好提交时,在我看来,MySQL 相对于我的连接,所以我将提交一个新的空事务。当我提交一个空事务时,MySQL 没有报告任何错误,所以我无法注意到我的整个事务都被回滚了。
问题.什么是一小段代码示例,我可以确定我的数据的责任完全掌握在 MySQL 手中而不是我的手中? (换句话说,我如何确保(使用 PHP 和 MySQL)当我提交事务时,整个事务成功地掌握在 MySQL 手中?)
参考. Previously,我曾经相信来自mysqli_commit 的返回布尔值。现在我的理解是我不能相信它。这个链接问题的答案可能是说我所需要的只是用 mysqli_report 尝试捕获而不是沉默。但我不相信。由于我无法轻易地重现隐式回滚,我正在寻找两件事 --- (1) 一个代码示例,我可以确定提交按预期发生,(2) 一种确定性的方式来重现隐式回滚,如果可能的话。在我看来,(2)并不容易,所以我先研究(1)。
版本.我正在运行 MySQL 5.7.38-log 和 PHP 7.4。
【问题讨论】:
-
为什么您不再信任从 mysqli_commit() 返回的布尔值?这些注释是关于错误报告的,这是不同的。如果您不能假设它返回 true 时一切都很好,我会感到非常惊讶。
标签: php mysql mysqli transactions innodb