0

関連する BEGIN トランザクションの後にあったコマンドにのみ影響しますか?

例えば:

BEGIN TRAN
UPDATE orders SET orderdate = '01-08-2013' WHERE orderno > '999'

ここで、誰かが別のテーブルに 10,000 の新しいレコードを挿入するデータ インポートを実行するとします。

その後 ROLLBACK コマンドを発行した場合、それらのレコードは破棄されますか、それともロールバックされるのは上記のコマンドだけですか?

これがばかげた質問でしたら申し訳ありません。私は COMMIT と ROLLBACK を使い始めたばかりです。

4

1 に答える 1

3

すべてのトランザクションは、それが開かれた接続に限定されます。

リレーショナル データベース管理システムの 4 つの ACID プロパティの 1 つは分離です。つまり、コミットするまで、アクションは他の接続から分離され、その逆も同様です。あなたが行った変更は他の接続には見えず、ロールバックすると、それが行われたことを知ることはありません. つまり、別の場所で行われた変更は、コミットされるまで見えません。特に、他の人の変更を ROLLBACK できないことを意味します。

分離は、2 つの方法のいずれかで達成されます。1 つの方法は、リソース (行など) を「ロック」することです。その場合、その行から読み取ろうとする他の接続は、トランザクションが完了するまで待機する必要があります。もう 1 つの方法は、古い値を含む行のコピーを作成することです。この場合、トランザクションをコミットするまで、他のすべての接続には古いバージョンが表示されます。

SQL Server では、両方の分離方法を使用できます。どちらが使用されるかは、選択した分離レベルによって異なります。2 つのスナップショット分離レベルは「コピー方法」を提供し、他の 4 つは「ロック方法」を使用します。「読み取りコミット」のデフォルト分離レベルは、「ロック方式」分離レベルの 1 つです。

ただし、分離レベル「READ UNCOMMITTED」は基本的にこれらのメカニズムを回避し、他の人が開始してまだコミットしていない変更を読み取ることができることに注意してください。これは、問題を診断するときに役立つ特別な分離レベルですが、本番コードでは避ける必要があります。

于 2013-08-01T14:01:04.737 に答える