InnoDB дубликат вставки при фиксации транзакции - PullRequest
0 голосов
/ 07 апреля 2020

Я пытался заставить транзакции работать на моем локальном сервере WAMP с MySQL и структурой БД InnoDB, но всякий раз, когда я 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()}";
}

Ожидается, что при отсутствии ошибок будут созданы два пользователя. Вместо вставлено четыре пользователей.

enter image description here

Я пытался SET autocommit=0; до начала транзакции, но это не имело значения.

ОБНОВЛЕНО

Пользователь Уилл предложил посмотреть журналы доступа, и было решение. Google Chrome ВСЕГДА пытается получить favicon.ico (даже если он не указан) из-за того, что apache2 перенаправляет все запросы (кроме существующих файлов) на index.php, текущий запрос также ВСЕГДА выполняется снова.

1 Ответ

0 голосов
/ 07 апреля 2020

Положите $ db-> beginTransaction (); Внутри попробуйте заявление.

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