【发布时间】:2020-04-07 06:35:11
【问题描述】:
我一直试图让事务在运行 MySQL 和数据库结构 InnoDB 的本地 WAMP 服务器上运行,但每当我 commit 事务时,所有查询都会执行两次。
我创建了一个相当简单的脚本来插入 两个 用户:
$db = new \PDO($dsn, $username, $password);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->beginTransaction();
try {
$stmt = $db->prepare("INSERT INTO users (username, email, created_at) VALUES ('user1', 'user1@mail.com', 0)");
$stmt->execute();
$stmt = $db->prepare("INSERT INTO users (username, email, created_at) VALUES ('user2', 'user2@mail.com', 1)");
$stmt->execute();
$db->commit();
echo 'Success';
} catch (\Exception $e) {
$db->rollBack();
echo "An error occurred {$e->getMessage()}";
}
预期如果没有错误,则创建两个用户。而是插入了 四个 用户。
我在开始交易之前尝试过SET autocommit=0;,但这并没有什么不同。
更新
用户将建议查看访问日志并找到解决方案。由于 apache2 将所有请求(存在的文件除外)重定向到 index.php,谷歌浏览器 总是 尝试获取 favicon.ico(即使未指定),当前请求也是总是再次执行。
【问题讨论】:
-
很抱歉这些问题,但我们需要确定:您的测试前数据库是空的吗?你的脚本只运行过一次吗?
-
是的,在我运行脚本之前,我会删除所有(但第一个)用户以获得干净的测试结果。
-
显示它是如何被调用的(网页某处的一些 JS,在 cli ,在一个 shell 脚本中????)
-
另外,您可以更改您的查询以在 created_at 列中插入 time() 吗?它可能会有所帮助
-
ow.. 也许看看你的 access_log(如果使用 apache)并确保脚本只被调用一次?