3

同じデータベース内の2つの別々のテーブルにデータを挿入する必要があります。現在、挿入ごとに個別のクエリ/トランザクションを使用していますが、最近、2つの挿入を1つのトランザクションに組み合わせることができることを学びました。

それらを別々のトランザクションとして保持するのではなく、1つのトランザクションに結合することの違いは何ですか?

4

4 に答える 4

10

Well Transactionは、SQLステートメントをロールバックする機能を提供します。たとえば、table1とtable2の2つのテーブルがあり、table1に正しく挿入された場合にのみ、table2にデータを挿入します。table1にデータを挿入するときにエラーが発生した場合、table2にデータを挿入しません。このシナリオでは、次を使用します。取引。

トランザクションの4つの基本機能:

  1. Atomicity:2つ以上の情報がトランザクションに関係している場合、すべてのピースがコミットされるか、いずれもコミットされません。
  2. Consistency:トランザクションの終了時に、新しい有効な形式のデータが存在するか、データが元の状態に戻されます。
  3. Isolation:トランザクション中(コミットまたはロールバックされる前)、データは分離された状態のままであり、他のトランザクションからアクセスできないようにする必要があります。
  4. Durability:トランザクションがコミットされた後も、サーバーに障害が発生したり再起動したりしても、データの最終状態は引き続き利用できます。
于 2012-07-12T12:21:51.320 に答える
4

データが相関している場合、つまり2番目のSQLによって保存されたデータが、最初のクエリによって保存されたデータと何らかの方法でリンクされている場合、またはその逆の場合は、を作成することを検討する必要がありtransactionます。このようにrollbackして、クエリの1つで問題が発生した場合に発生する可能性があります。try-catchこれはステートメントで実装できます。クエリが互いに完全に無関係である場合は、2つの別々のSQLステートメントを使用できます。

ただし、2つのテーブルのデータは同じであるため、トランザクションを実行する方がよいと思います。したがって、将来、結合や削除などの操作を行う必要がある場合でも、一貫性のあるデータベースがあります。

于 2012-07-12T12:26:03.670 に答える
1

1つのことは他とは何の関係もありません。

両方を同じトランザクションに入れることのポイントは、両方が発生するか、どちらも発生しないことです。

最初の挿入が成功し、2番目の挿入が失敗した場合、それはどこにあなたが尋ねる必要のある質問であり、答える必要がありますか。

個人的には、いくつかの操作で両方の挿入を行っているので、2番目のトランザクションの失敗の結果が他の場所で処理されたとしても、1つのトランザクションは理にかなっています。

于 2012-07-12T12:20:21.013 に答える
1

これらの2つの挿入をアトミックに実行する必要がありますか(つまり、両方とも成功または失敗する必要がありますが、一方を成功させ、もう一方を失敗させることはできません)?

  • はいの場合は、同じトランザクションでそれらを囲む必要があります。
  • いいえの場合、以下に説明するように、選択にある程度の自由度があります...

トランザクションはACIDであり、「D」は「耐久性」を表します。これは、実際には、DBMSがデータが永続ストレージに物理的に書き込まれるまで待機する必要があることを意味します(データをキャッシュに保存してすぐに移動するのではありません)。パフォーマンス上の理由から、この「耐久性待機」は比較的まれである必要があります。この点では、トランザクションを2つ(ステートメントごとに1つ)ではなく1つにする方が適切です。もちろん、これによりアトミックになりますが、これは望ましい場合と望ましくない場合があるため、パフォーマンスと目的の動作のバランスをとる必要があります。

于 2012-07-12T12:31:36.760 に答える