データベーストランザクションにどの程度依存していますか?
小さなトランザクションスコープと大きなトランザクションスコープのどちらが好きですか?
サーバー側のトランザクションよりもクライアント側のトランザクション処理(.NETのTransactionScopeなど)を優先しますか、またはその逆ですか?
ネストされたトランザクションはどうですか?
取引に関するヒントやコツはありますか?
トランザクションでの作業で遭遇した落とし穴はありますか?
あらゆる種類の回答を歓迎します。
データベーストランザクションにどの程度依存していますか?
小さなトランザクションスコープと大きなトランザクションスコープのどちらが好きですか?
サーバー側のトランザクションよりもクライアント側のトランザクション処理(.NETのTransactionScopeなど)を優先しますか、またはその逆ですか?
ネストされたトランザクションはどうですか?
取引に関するヒントやコツはありますか?
トランザクションでの作業で遭遇した落とし穴はありますか?
あらゆる種類の回答を歓迎します。
私は常にトランザクションをusingステートメントでラップします。
using(IDbTransaction transaction )
{
// logic goes here.
transaction.Commit();
}
トランザクションがスコープ外に移動すると、破棄されます。トランザクションがまだアクティブな場合は、ロールバックされます。この動作により、データベースが誤ってロックアウトされるのを防ぐことができます。未処理の例外がスローされた場合でも、トランザクションはロールバックされます。
私のコードでは、実際には明示的なロールバックを省略し、usingステートメントに依存して作業を行っています。明示的にコミットのみを実行します。
このパターンにより、レコードロックの問題が大幅に減少したことがわかりました。
個人的には、トラフィックパフォーマンスの高いWebサイトを開発しているので、可能な限りデータベーストランザクションを避けています。明らかにそれらは必要なので、私はORMとページレベルのオブジェクト変数を使用して、サーバー側の呼び出しの数を最小限に抑えています。
ネストされたトランザクションは、呼び出しを最小限に抑えるための優れた方法です。ロックを引き起こさない迅速なクエリである限り、可能な限りその方向に進みます。これらの場合、NHibernateは救世主でした。
参考までに...ネストされたトランザクションは危険な場合があります。デッドロックが発生する可能性が高まるだけです。したがって、それは必要であり、良いことですが、大量の状況では実装方法が重要です。
わお!たくさんの質問!
1 年前まで、私はトランザクションに 100% 依存していました。現在は 98% しかありません。トラフィックの多い Web サイト (Sara が言及したようなもの) や、分割されたデータが多い特殊なケースでは、分散トランザクションの必要性が強まり、トランザクションのないアーキテクチャを採用できます。次に、アプリケーションで参照整合性をコーディングする必要があります。
また、アノテーション (私は Java の専門家です) とアスペクトを使用して、トランザクションを宣言的に管理することも好きです。これは、トランザクションの境界を決定するための非常にクリーンな方法であり、トランザクションの伝播機能が含まれています。
データベースへのすべての書き込み操作でトランザクションを使用します。
そのため、大きなトランザクションにラップされた小さな「トランザクション」がかなりあり、基本的に、ネスト コードには未処理のトランザクション カウントがあります。親を終了するときに未処理の子がある場合、そのすべてがロールバックされます。
利用可能な場合は、クライアント側のトランザクション処理を好みます。sps またはその他のサーバー側の論理的な作業単位に追いやられている場合は、サーバー側のトランザクションは問題ありません。
サーバー側トランザクション、毎秒 35,000 トランザクション、SQL Server: 35,000 tps からの 10 レッスン
サーバー側のトランザクションのみを使用します。
他の:
1 日あたり何百万もの INSERT 行 (ステージング テーブルを介してバッチ処理されたものもある)、完全な OLTP、問題なく処理します。ただし、35k tps ではありません。
Sara Chippsが言ったように、トラフィックの多いアプリケーションではトランザクションはやり過ぎです。したがって、可能な限り回避する必要があります。つまり、ACIDではなくBASEアーキテクチャを使用します。Ebayは典型的なケースです。分散トランザクションは、Ebayアーキテクチャではまったく使用されていません。ただし、結果整合性を得るには、自分で何らかのトリックを実行する必要があります。
これは、T-SQL トランザクションをネストするための興味深いリンクです。