MySQL autocommit — вставки игнорируются

У меня есть база данных MySQl с несколькими таблицами, все хранилища UTF-8 и MyISAM. В PHP я разбираю файл XML, который записывает много данных в таблицы. Я использую только простые операторы Insert и функции mysqli.

Действия чтения в таблице не так уж много и ни одно из них не во время вставки. Сначала производительность была очень низкой, поэтому я добавил SET AUTOCOMMIT = 0 в начале скрипта.

Проблема, с которой я сталкиваюсь сейчас, заключается в том, что все мои вставки, которые находятся, например, в. третий цикл foreach игнорируется и не отображается в таблицах mysql. Все до этого нормально.

Итак, мой вопрос, что я делаю неправильно и как мне это сделать?

С включенной автоматической фиксацией = все вставляется, но очень-очень медленно С выключенной автоматической фиксацией = все очень быстро, но многие вставки игнорируются

Надеюсь, у кого-то есть идея и может помочь.


person WorldSignia    schedule 23.05.2012    source источник


Ответы (2)


MySQL работает быстрее с отключенной автоматической фиксацией, потому что команды INSERT не записываются в вашу базу данных немедленно; данные сохраняются только при выполнении оператора COMMIT. У вас есть оператор COMMIT после вставки ваших данных?

person Geert    schedule 23.05.2012
comment
Ах вот чего мне не хватало. Большое спасибо :) Теперь работает нормально :) - person WorldSignia; 23.05.2012

Вы должны попробовать так:

<?php
try {
    $db->beginTransaction();

    $stmt = $db->prepare("SOME QUERY?");
    $stmt->execute(array($value1));

    $stmt = $db->prepare("YET ANOTHER QUERY??");
    $stmt->execute(array($value2, $value3));

    $db->commit();
} catch(PDOException $ex) {
    //Something went wrong then rollback!
    $db->rollBack();
    echo $ex->getMessage();
}

Примечание. вызов bindTransaction() автоматически отключает автоматическую фиксацию.


В то время как с mysqli вместо этого вы можете использовать следующее:

mysqli_autocommit($dbh, FALSE);    // turn off auto-commit
mysqli_rollback($dbh);    // if error, roll back transaction
mysqli_commit($dbh);    // commit transaction
person Vishal    schedule 23.05.2012