1

いつトランザクションを使用すべきかについての記事を読みました。私は読む:

どのような場合にトランザクションを使用する必要がありますか? 基本的に、エラーが発生した場合やその他の理由で、外部の変更に敏感な作業ユニットや、すべての変更をロールバックする機能が必要な作業ユニットがあるときはいつでも。

しかし、誰かが私にそれをよりよく説明できますか?

  • 2 つ以上の削除/更新/挿入クエリを実行する場合、トランザクションを開始する必要がありますか?
  • 削除/更新/挿入クエリが 1 つしかない場合でも、トランザクションを開始する必要がありますか?
  • 1 ページで 10 回のトランザクションを開始する必要がありますか、それともページ全体で 1 回のみにするのがよいでしょうか? または各ページに最大 (たとえば 5) をお勧めしますか?

ご協力いただきありがとうございます!

4

2 に答える 2

7

トランザクションは、相互に依存するクエリのグループがある場合に使用されます。

たとえば、銀行:

  • 銀行の顧客「ジョン」は、「アリス」の口座に 100 ドルを送金します。
  • この例では、2 つのクエリがあります (ログやトランザクション履歴は表示していません...など)。John の残高から $100 を差し引いて、Alice の残高に追加する必要があります。
  • Start transaction
  • ジョンから差し引く
    • UPDATE accounts SET balance=balance-100 WHERE account='John'
  • アリスに追加
    • UPDATE accounts SET balance=balance+100 WHERE account='Alice'
  • commit

トランザクションは、コミットするまで保存されません。したがって、いずれかのクエリでエラーが発生した場合はrollback、トランザクションの開始以降に実行されたクエリを呼び出して元に戻すことができます。何らかの理由で Alice に $100 を追加するクエリが失敗した場合、ロールバックして John から $100 を差し引くことはできません。これは、必要に応じてクエリを自動的に元に戻すことができるようにする方法です。


  • 2 つ以上の削除/更新/挿入クエリを実行する場合、トランザクションを開始する必要がありますか?

    クエリが何をしているかによって異なります。

  • 削除/更新/挿入クエリが 1 つしかない場合でも、トランザクションを開始する必要がありますか?

    コミット (保存) を呼び出す前に、更新を実行して検証するように、クエリをロールバック (元に戻す) する方法が必要でない限り、必要ありません。

  • ページで 10 回のトランザクションを開始する必要がありますか、またはページ全体で 1 回のみにすることをお勧めしますか、または各ページの最大数 (たとえば 5) をお勧めしますか?

    必要な数だけ開始します。ページの読み込みごとに 1 つのこと (送金など) を行う可能性が高いため、ページごとに複数のトランザクションがあるとは思えません。

于 2013-08-28T19:41:58.787 に答える
2

関連するクエリのグループを 1 つのクエリであるかのように実行する必要がある場合は、トランザクションを使用します。

例えば:

ショッピング カートで誰かが商品を宣伝すると、ストアの在庫が更新され (存在が減る)、顧客のカートが更新されます (カートの商品が増えます)。この場合、2 つの操作が行われるため、トランザクションを作成します。クエリの 1 つが失敗した場合 (ストアの製品が不足している場合)、2 番目のクエリは発生しません (顧客のカートに製品を追加する)。この場合、2 つのクエリは作業単位に準拠しています。つまり、データベースは両方を処理するか、まったく処理しない必要があります。

さて、あなたのポイントを考慮して、トランザクションを使用して無関係なクエリを実行する確固たる理由はわかりません(特別な必要がない限り)。使用しているデータベース エンジンと、不要なトランザクションを開発しているシステムによっては、パフォーマンスのボトルネックが発生します。

一方、複数のトランザクションを実行する必要があるアプリケーションもあるかもしれませんが、それは一般的なルールがないため、ケースバイケースで決定する必要があります。

ページごとのトランザクションの量を制限する、またはページごとに 1 つのトランザクションのみを作成するという懸念については、これは達成しようとしていることに依存しているとしか言えません。10 件の関連するクエリを実行する必要がある場合がありますが、失敗すると一緒にロールバックされ、1 つのトランザクションが必要になります。ロールバックする必要のない多くの無関係なクエリを実行する必要がある場合は、トランザクションさえ必要ないことを意味します。

この件に関するウィキペディアのエントリも確認できます。

http://en.wikipedia.org/wiki/Database_transaction

于 2013-08-28T19:50:08.067 に答える