SQL データベースに対して主にフォームベースの CRUD 操作を行う通常の Web アプリケーションを考えてみましょう。そのような Web アプリケーションでは明示的なトランザクション管理が必要ですか? それとも、単に自動コミット モードを使用する必要がありますか? また、トランザクションを行う場合、「リクエストごとのトランザクション」で十分ですか?
6 に答える
明示的なトランザクションを使用するのは、実際にトランザクションを行う場合 (たとえば、相互に関連性の高い複数の SQL コマンドを発行する場合など) だけです。これの典型的な例は銀行のアプリケーションだと思います.1つの口座からお金を引き出して別の口座に入金することは、常にバッチとして成功または失敗する必要があります。
SO ではトランザクションを使用しますが、控えめにしか使用しません。データベースの更新のほとんどは、スタンドアロンでアトミックです。上記の銀行の例の特性を持つものはほとんどありません。
自動コミット モードでは部分的なデータ保存が発生する可能性があるため、データの整合性を確保するためにトランザクション モードを使用することを強くお勧めします。
これは通常、データベース インターフェイス層で処理されます。Web アプリケーションがトランザクション内で複数のストアド プロシージャを呼び出すことはめったにありません。通常、トランザクション全体を管理する単一のストアド プロシージャを呼び出すため、Web アプリケーションは失敗するかどうかだけを気にする必要があります。
通常、Web アプリケーションは他のもの (テーブル、ビュー、内部ストアド プロシージャ) へのアクセスを許可されていないため、事前にクライアントによって接続レベルで開始されたトランザクションにラップされずにアクセスしようとすると、データベースが無効な状態になる可能性があります。彼らの呼びかけに。
これには例外があり、トランザクションが Web アプリケーションによって開始されますが、一般的にはほとんどありません。
異なるユーザーが同時にデータベースにアクセスすることを考えると、トランザクションを使用する必要があります。自動コミットを使用しないことをお勧めします。明示的なトランザクション ブラケットを使用します。各トランザクションの解決に関しては、特定の作業単位を括弧で囲む必要があります (それがコンテキストで何を意味するかに関係なく)。
また、SQL データベースがサポートするさまざまなトランザクション分離レベルを調べることもできます。それらは、部分的に更新されたレコードを読むユーザーが見るものに関して、さまざまな動作を提供します。
単一のストアド プロシージャで複数のテーブルに挿入/更新することをお勧めします。そうすれば、Web アプリケーションからトランザクションを管理する必要がなくなります。
CRUD 処理がどのように行われるかによって異なります。モデル インスタンスのすべての作成と変更が単一の更新クエリまたは挿入クエリで行われる場合にのみ、自動コミットを使用できます。
複数のクエリ モード (悪い考え、IMO) で CRUD を処理している場合は、トランザクションを明示的に定義する必要があります。これらのクエリは確かに「トランザクションに関連する」ため、データベースの半分のモデルで終了することは望ましくありません。 . 一部の Web フレームワークは、さまざまな理由で「複数のクエリ」の方法で処理を行う傾向があるため、これは重要です。
どのトランザクション モードを使用するかは、データ ビューに関して何をサポートできるか (つまり、クライアントから見たときにデータがどれだけ最新である必要があるか) と、パフォーマンスに関して何をサポートする必要があるかによって異なります。