1

一連のクエリを実行するときにトランザクションが役立つので、私は疑問に思っています。ただし、クエリを 1 つしか実行していない場合は、わざわざそれを使用する必要がありますか?

私は現在持っています

$res = $pdo->query("SELECT id FROM products LIMIT 5");
$row = $res->fetchAll();

そして、それがすることはそれだけです。次のコードはより効率的ですか? (1つのことしかしていないので、そうではないと思いますが、よくわかりません)

$pdo->beginTransaction();
$res = $pdo->exec("SELECT id FROM products LIMIT 5");
$pdo->commit();

より効率的でない場合、より効率的な代替方法はありますか?

ありがとうございました。

4

2 に答える 2

3

スクリプトが実行している機能にとって重要なクエリの後に実行されるアクション(e コマース トランザクションとしましょう) があり、クエリをそのままにしておくことが問題になる場合 (つまり、支払いに関連する何かが失敗した場合)、次のことを行います。実行されるクエリは 1 つだけですが、トランザクションを使用します。そうしないと、支払いなしで購入することになります。

そのトランザクションがそのスクリプトで発生する唯一のものである場合、トランザクションは不要であり、回避できる/回避する必要があります。

簡単な例を次に示します。

try 
{
    $pdo->beginTransaction();
    $res = $pdo->exec("INSERT INTO orders ....");
    // Try to make payment
    $payment->process();
    $pdo->commit();
}
catch (Exception $e)
{
    // Payment failed unexpectedly! Rollback the transaction.
    $pdo->rollback();
}

当然のことながら、このような失敗をより適切に処理したいと思うでしょうが、これにより、トランザクションが適切な場合の適切なデモンストレーションが得られるはずです。

于 2012-06-17T16:56:49.943 に答える
2

トランザクションは効率ではありません

トランザクションを使用すると、複数のステートメントを 1 つのアトミック ステートメントにグループ化できます。つまり、トランザクションは完全に完了するか、まったく完了しませんが、部分的に完了してはなりません。たとえば、ある銀行口座からお金を引き出して別の銀行口座に追加した場合、このアクションは完全に行われるか (アカウント a は $x 少なく、アカウント b は $x 多い)、またはまったく行われないかのいずれかです。起こってはならないことは、アカウント a からお金を引き出すことです。その後、システムがクラッシュし、お金がデジタル ボイドで失われます。

トランザクションを持たないことはできません

PDO を使用していて、明示的にトランザクションを開始しない場合、自動コミット モードになります。つまり、クエリを開始するたびに、トランザクションが開始され、クエリが実行され、トランザクションがすぐにコミットされます (完了としてマークされることを意味します)。

まだパフォーマンスについて考えていますか?

まれに、パフォーマンスとトランザクションについて考えることが正当化される場合があります。たとえば、大量のデータを操作している場合、(実際に DB に依存するかどうかは) 1 つの大規模なトランザクションですべてのステートメントを実行する方が高速です。一方、この場合、これらの操作をトランザクションで行うのはおそらく論理的です。なぜなら、プログラムがクラッシュした場合、プログラムを再実行する必要があり、前回終了した場所ではなく、最初から開始する必要があるためです。 .

于 2012-06-17T17:11:34.863 に答える