1

私はいくつかのテーブルを持つ MySQl データベースを持っています。すべて UTF-8 と MyISAM ストレージです。PHP では、大量のデータをテーブルに書き込む XML ファイルを解析しています。単純な Insert ステートメントと mysqli 関数のみを使用しています。

テーブルにはそれほど多くの読み取りアクションはなく、挿入中のアクションはありません。まず、パフォーマンスが非常に遅かったため、スクリプトの先頭に SET AUTOCOMMIT = 0 を追加しました。

私が今抱えている問題は、たとえば 3 番目の foreach ループにあるすべての挿入が無視され、mysql テーブルに表示されないことです。それ以前は大丈夫です。

私の質問は、何が間違っているのか、どうすればよいのかということです。

自動コミットがオンの場合 = すべてが挿入されますが、非常に遅い 自動コミットがオフの場合 = すべてが非常に高速ですが、多くの挿入が無視されます

うまくいけば、誰かがアイデアを持ち、助けてくれるでしょう。

4

2 に答える 2

1

次のように試してください:

<?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
于 2012-05-23T08:30:26.720 に答える