1. ホーム
  2. sql

[解決済み] 1つのステートメントにまつわるトランザクションは何をするのか?

2023-08-12 12:43:22

質問

トランザクションがどのように一組の更新を調整するのに有用であるかは理解しています。 私が理解していないのは、トランザクションで単一のステートメントをラップすることであり、それは私がこれまで見てきたことの90%です。 実際、実際のコードでは、論理的に関連する一連のトランザクションがそれぞれ独自のトランザクションにラップされ、全体はトランザクションにラップされていないことが、私の経験ではより一般的です。

MS-SQL では、単一の選択、単一の更新、単一の挿入、または単一の削除をトランザクションでラップすることに何か利点がありますか?

これは迷信的なプログラミングではないでしょうか。

どのように解決するのですか?

何もしません。 個々の SQL 文はすべて (ログなしの一括挿入やテーブルの切り捨てなどのまれな例外を除いて)、明示的にそう言ったかどうかにかかわらず、自動的に "トランザクションに含まれます (たとえ数百万行の挿入や更新、または削除であっても)。(たとえ数百万行の挿入、更新、または削除が行われたとしても)。

編集: 下の @Phillip のコメントに基づいて... SQL Server の現在のバージョンでは、一括挿入とテーブルの切り捨てでさえ、次のように記述します。 いくつかの のデータをトランザクション ログに書き込みますが、他の操作ほどではありません。 トランザクションの観点から見た重要な違いは、これらの他のタイプの操作では、変更されるデータベース テーブルのデータは、ロールバックできる状態でログに残らないということです。

これが意味するのは、ステートメントがデータベース内のデータに加える変更は、操作が失敗した場合に元に戻すことができるように、トランザクション ログに記録されるということだけです。

Begin Transaction", "Commit Transaction" and "RollBack Transaction" コマンドが提供する唯一の機能は、2つ以上の個別の SQL 文を同じトランザクションに入れることができるようにすることです。

編集: (マークのコメントを補強するために...) はい、これは迷信的なプログラミングに起因することもあれば、データベース トランザクションの性質に対する根本的な誤解の表れである可能性もあります。 より慈悲深い解釈としては、単に不適切な一貫性を過剰に適用した結果であり、Emersons の婉曲表現のもう 1 つの例であるということです。

愚かな一貫性は、小さな心のホブゴブリンである。

小さな政治家、哲学者、神学者に愛されている。