【问题标题】:Why is the rollback for my transaction not working?为什么我的事务回滚不起作用?
【发布时间】:2021-07-06 05:54:44
【问题描述】:

我执行了以下代码:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = mysqli_connect($host, $user, $pw, $db);
$mysqli->begin_transaction();
try {
    $mysqli->query("Update User SET name='Ginso1' WHERE id=6");
    $mysqli->query("Update Userr SET name='Ginso2' WHERE id=6");
    $mysqli->commit();
} catch(mysqli_sql_exception $exeption) {
    $mysqli->rollback();
    echo "exception";
}

当然,表 Userr 不存在(而 User 存在),所以第二个查询应该抛出异常。这似乎有效,因为执行了回声。但是当我之后检查我的数据库时,我看到给定的 id 的名称已更改为“Ginso1”。为什么回滚不起作用?

我只是直接在 phpMyAdmin 中尝试过,但回滚在那里也不起作用:

START TRANSACTION;
UPDATE User SET name='TEST' WHERE id=6;
ROLLBACK;

【问题讨论】:

  • 你试过关闭自动提交吗?
  • 刚试过,没有变化。(不管我是在begin_transaction987654323@之前还是之后做的)
  • 你说“应该”抛出异常。可以?如果你在没有 try/catch 的情况下这样做会发生什么?
  • 你的表是 InnoDB 吗?
  • @Dave 是的。正如我所说,catch 子句的 echo 语句被执行

标签: php sql mysqli


【解决方案1】:

您的表引擎很可能不是 InnoDB。正如手册所说,要使事务正常工作,您的数据库表必须使用事务引擎,例如InnoDB。

MyISAM 不是事务性的。

【讨论】:

  • 我怎样才能知道?这是来自 lima-city.com 的 MySQL 数据库
猜你喜欢
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-23
  • 2021-07-29
  • 1970-01-01
相关资源
最近更新 更多