【问题标题】:InnoDB duplicate insert on transaction commitInnoDB 在事务提交时重复插入
【发布时间】: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)并确保脚本只被调用一次?

标签: php mysql sql innodb


【解决方案1】:

把你的 $db->beginTransaction();在 try 语句中。

$db = new \PDO($dsn, $username, $password);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);



try {
$db->beginTransaction();

    $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()}";
}

【讨论】:

  • 用户 @Will 让我走上了正确的道路,显然 Chrome 总是得到 favicon.ico,即使它没有被指定 - apache2 将请求(存在的文件除外)重定向到 index.php这意味着 /favicon.ico 路由总是重定向到 index.php 如果有 no favicon.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-01
  • 1970-01-01
相关资源
最近更新 更多