【发布时间】: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 语句被执行