0

以前使っていた

<?php
$sql = "insert into test (owner) values ('owen')";
$db->autocommit(false);
if (!$db->query($sql))
    $db->rollback();
else
    $db->commit();
$db->close();
?>

ただし、今日、同じテーブルで 2 つの挿入 php ファイルを実行しましたが、何のアクションもありません。次のように簡単です:

<?php
$sql = "insert into test (owner) values ('owen')"; //the other php is the same but replacing 'owen' to 'huhu'
for ($i = 0; $i < 100 * 1000; $i++) {
    $db->query($sql);
}
$db->close();
?>

2 つの異なるコンソールで 2 つの php ファイルを実行します。その後、エラーなしで 200,000 レコードを取得しました。トランザクションを手動で使用する必要がないということですか。競合がないので。

4

1 に答える 1

4

これにはトランザクションは必要ありません。

トランザクションは、データベースへの半分終了した変更をロールバックできるようにするために存在します。これらは、途中で中断される可能性のあるデータベースを変更する一連の複数のステートメントがある場合にのみ発生します。その後、多くの場合、一部のステートメントのみが実行され、データベースがアプリケーションの観点から「クリーン」ではない状態になる可能性があります。

シンプルで良い例は、2 つのテーブル間の送金です。

  • 最初に 1 つのテーブルからの削除

  • 次に、2 番目のテーブルに追加されます

このプロセスが途中で中断されると、お金は消えてしまいます。これは意図したものではありません。おそらくロールバックできるようにしたいでしょう。

ただし、あなたの場合、すべてのステートメントは「アトミック」です。つまり、成功または失敗しますが、データベースの状態は常に「クリーン」です。ステートメントを実行しているクライアントが 1 つか複数かは問題ではありません。

于 2013-09-14T12:11:14.403 に答える