0

PHP を使用してプロジェクトで SQL ステートメントを実行するために beginTransaction() を使用することに成功しました。データベースに書き込む必要があるアイテムの配列があり、各アイテムは保存する前に何かに対して検証する必要があります。データベースの自動コミット動作をオフにする利点の 1 つは、途中で何か問題が発生した場合に、トランザクション全体をロールバックできることです。私のプロジェクトでは、1 つのアイテムが無効な場合、配列全体をデータベースに記録するべきではありません。そのため、このアプローチを使用することにしました。

今、私はこれが本当にパフォーマンスの面でより良い方法であるかどうか疑問に思っていますか? 配列の最後の項目が検証されたとしても、以前の実行を手動で commit() する必要があるためです。コミットはSQLの実行を繰り返しますか?

私が今思いつく唯一の利点は、それらをすべて検証して (すべての項目が有効であると仮定して)、それぞれを書きたい場合に、2 回ではなく 1 回のループで済むことです。

4

3 に答える 3

2

最初にすべてを検証してから、トランザクション、データベースの対話を開始します。データの検証を支援するためのトランザクションは行われません。

于 2012-05-05T09:50:19.043 に答える
0

セーブポイントを使用できます。マニュアルから:

BEGIN;
     INSERT INTO table1 VALUES (1);
     SAVEPOINT my_savepoint;
       INSERT INTO table1 VALUES (2);
     ROLLBACK TO SAVEPOINT my_savepoint;
     INSERT INTO table1 VALUES (3); 
COMMIT;

入力を検証する必要がありますが、単一のトランザクション内でロールバックできるようになりました。トランザクションを使用すると、(暗黙の)コミットが少なくなるため、データベースを高速化できます。

于 2012-05-05T10:07:46.330 に答える
0

コミットは SQL の実行を繰り返しません。

通常、トランザクションで作業する場合、INSERT/UPDATE/DELETE ステートメントを実行するたびに、データベースはレコード/データ ページのコピーをトランザクション ログに取得し、実際のレコード変更を実行します。

トランザクション中に他の誰かがこれらのレコード/データ ページにアクセスしようとすると、それらはトランザクション ログのコピーにリダイレクトされます。

次に、コミットを実行すると、データベース自体のデータは既に更新されており、サーバーが行う必要があるのは、トランザクション ログを削除することだけです。

コミットではなくロールバックすると、データベース サーバーはトランザクション ログをバックトラックし、更新したすべてのレコード/データ ページを元の状態に復元し、各トランザクション ログ エントリを削除します。

したがって、データベース サーバーはデータをトランザクション前の状態に復元する必要があるため、ロールバックはオーバーヘッドになります。

于 2012-05-05T10:08:23.590 に答える