31

データベーストランザクションにどの程度依存していますか?

小さなトランザクションスコープと大きなトランザクションスコープのどちらが好きですか?

サーバー側のトランザクションよりもクライアント側のトランザクション処理(.NETのTransactionScopeなど)を優先しますか、またはその逆ですか?

ネストされたトランザクションはどうですか?

取引に関するヒントやコツはありますか?

トランザクションでの作業で遭遇した落とし穴はありますか?

あらゆる種類の回答を歓迎します。

4

8 に答える 8

21

私は常にトランザクションをusingステートメントでラップします。

using(IDbTransaction transaction )
{
// logic goes here.
   transaction.Commit();
}

トランザクションがスコープ外に移動すると、破棄されます。トランザクションがまだアクティブな場合は、ロールバックされます。この動作により、データベースが誤ってロックアウトされるのを防ぐことができます。未処理の例外がスローされた場合でも、トランザクションはロールバックされます。

私のコードでは、実際には明示的なロールバックを省略し、usingステートメントに依存して作業を行っています。明示的にコミットのみを実行します。

このパターンにより、レコードロックの問題が大幅に減少したことがわかりました。

于 2008-09-02T14:08:27.137 に答える
8

個人的には、トラフィックパフォーマンスの高いWebサイトを開発しているので、可能な限りデータベーストランザクションを避けています。明らかにそれらは必要なので、私はORMとページレベルのオブジェクト変数を使用して、サーバー側の呼び出しの数を最小限に抑えています。

ネストされたトランザクションは、呼び出しを最小限に抑えるための優れた方法です。ロックを引き起こさない迅速なクエリである限り、可能な限りその方向に進みます。これらの場合、NHibernateは救世主でした。

于 2008-09-02T14:10:56.210 に答える
3

参考までに...ネストされたトランザクションは危険な場合があります。デッドロックが発生する可能性が高まるだけです。したがって、それは必要であり、良いことですが、大量の状況では実装方法が重要です。

于 2008-09-05T14:45:35.430 に答える
3

わお!たくさんの質問!

1 年前まで、私はトランザクションに 100% 依存していました。現在は 98% しかありません。トラフィックの多い Web サイト (Sara が言及したようなもの) や、分割されたデータが多い特殊なケースでは、分散トランザクションの必要性が強まり、トランザクションのないアーキテクチャを採用できます。次に、アプリケーションで参照整合性をコーディングする必要があります。

また、アノテーション (私は Java の専門家です) とアスペクトを使用して、トランザクションを宣言的に管理することも好きです。これは、トランザクションの境界を決定するための非常にクリーンな方法であり、トランザクションの伝播機能が含まれています。

于 2008-09-02T15:53:36.073 に答える
3

データベースへのすべての書き込み操作でトランザクションを使用します。
そのため、大きなトランザクションにラップされた小さな「トランザクション」がかなりあり、基本的に、ネスト コードには未処理のトランザクション カウントがあります。親を終了するときに未処理の子がある場合、そのすべてがロールバックされます。

利用可能な場合は、クライアント側のトランザクション処理を好みます。sps またはその他のサーバー側の論理的な作業単位に追いやられている場合は、サーバー側のトランザクションは問題ありません。

于 2008-09-02T14:04:09.347 に答える
2

サーバー側トランザクション、毎秒 35,000 トランザクション、SQL Server: 35,000 tps からの 10 レッスン

サーバー側のトランザクションのみを使用します。

  • 後で開始し、より早く終了することができます
  • 配布されていません
  • 前後の仕事ができる
  • SET XACT_ABORT ON は、エラー時にすぐにロールバックすることを意味します
  • クライアント/OS/ドライバーに依存しない

他の:

  • 呼び出しをネストしますが、@@TRANCOUNT を使用して、既に開始されている TXN を検出します
  • 各 DB 呼び出しは常にアトミックです

1 日あたり何百万もの INSERT 行 (ステージング テーブルを介してバッチ処理されたものもある)、完全な OLTP、問題なく処理します。ただし、35k tps ではありません。

于 2009-10-16T15:40:54.167 に答える
0

Sara Chippsが言ったように、トラフィックの多いアプリケーションではトランザクションはやり過ぎです。したがって、可能な限り回避する必要があります。つまり、ACIDではなくBASEアーキテクチャを使用します。Ebayは典型的なケースです。分散トランザクションは、Ebayアーキテクチャではまったく使用されていません。ただし、結果整合性を得るには、自分で何らかのトリックを実行する必要があります。

于 2009-05-14T03:38:30.310 に答える
0

これは、T-SQL トランザクションをネストするための興味深いリンクです。

于 2008-09-05T14:32:19.940 に答える