1

なぜ良いのか少しはわかりますが、実世界で使われているのでしょうか?

もしそうなら、ネストされたトランザクションを作成するときにそれらはどのくらい役に立ちますか?メリットは何ですか?

たとえば(非常に緩い例)、他の人がSQLを(仮想的に)理解できるようにする目的でデータベースを作成しているとします。

したがって、データベースを作成し、スキーマを作成し、スキーマごとにテーブルを作成し、スキーマごとにシーケンスを作成し、テーブルに有効な情報を入力して、スクリプトを終了するスクリプトを作成する必要があります。

したがって、これを行う際に、バッチを分割して次々に実行します。たとえば、

 use master; go 

 create databse testdb; go

 use testdb; go

 create table tbl(XYZ); go
 insert into tbl (XYZ)   
 values (XYZ); go

では、そのブロックのどこでトランザクションを使用し、なぜそれらをネストするのでしょうか。

よろしくお願いします。

4

3 に答える 3

3

すべてのステートメントが正常に実行されることを保証できない場合、トランザクションは恩恵になります。基本的に、これは常に当てはまります。

現実的に回避できないエラーがあります:バグ、タイムアウト、デッドロック。これらのいずれかが発生した場合は、行ったすべての変更を元に戻し、エラーを報告する必要があります。一部のコードは途中でしか実行されなかったため、存在するデータ破損の問題をデバッグする必要はありません。

アトミック性以外にも用途があります。トランザクションを分離し、競合するトランザクションを検出し、競合するトランザクションを相互に待機させ、ロックを使用して相互排除を実現することができます。ほとんどのトランスはDML用であり、DDL用ではありません(実践から言えば)。データベースの一貫した時不変スナップショットを読み取るためだけのトランスエーカー。

于 2013-03-25T19:16:24.313 に答える
2

トランザクションは、一連のDML(データ操作言語)ステートメントの一貫性を確保するために使用されます。何かが失敗した場合(たとえば、重複キーを作成しようとしているため)、トランザクション全体がロールバックされ、たとえば、詳細行のない注文ヘッダーがありません。ROLLBACKステートメントを使用して手動でロールバックすることを選択できます。

トランザクションのもう1つの用途は、データベースの回復です。データベースがクラッシュした場合、通常は不整合が発生します。リカバリ操作は、不完全なトランザクションをロールバックします。

CREATE TABLEなどのDDL(データ定義言語)ステートメントは、通常、独自のトランザクションで実行されます。データディクショナリを一貫性のない状態のままにしたくない場合です。

あなたの例では、可能な唯一のトランザクションはINSERTの周りです。INSERTを実行すると、トランザクションが自動的に作成されます。システムで自動コミットがオンになっておらず、挿入のコミットに失敗した場合、データがデータベースに組み込まれることはありません。

ネストされたトランザクションは、親テーブルでトランザクションをロールバックする必要なしに、子テーブルへの挿入をロールバックして他のこと(たとえば、追加のユーザー入力を要求する)を行う必要がある複雑な状況で使用されます。

于 2013-03-25T18:58:12.460 に答える
0

create dbを使用すると、エラーが発生した場合にテーブルを削除できるため、トランザクションを使用する必要はありませんが...

これらは、複数のSQLステートメント間でアトミック性を維持しようとしている場合に非常に役立ちます。

于 2013-03-25T18:39:51.973 に答える