2

ロールバックまたはコミットできる単一のトランザクションに多くのデータベース挿入をラップする必要があるDALがあります。多くのトランザクションでSQLデータベース接続を管理する

これを処理するベストプラクティスは何ですか?

我々は現在、次のことを行っている。

  1. DB接続とトランザクションを作成
  2. は、実行するアクションを表すすべてのクラスでコレクションを記入してください。コンストラクタ経由で接続を渡します。
  3. すべてのアクションクラスをループし、Publish()メソッドを呼び出します。
  4. 成功すれば(接続を閉じる)、エラー(接続を閉じる)ならロールバックします。

プロセスはいつかかかる可能性があり、プールされたデータベース接続が不足しているようです。トランザクションを管理するより良い方法はありますか?

これは、エンタープライズライブラリのデータアクセスのSQL 2008、.net 3.5および4.1バージョンを使用しています。

+0

なぜ、すべてのクラスで挿入を行うために1つの接続のみを使用しているときに、プールされた接続が不足しているとしますか? – msvcyc

+0

実際、明らかなように、私たちが見ているエラーは次のとおりです。プールから接続を取得する前にタイムアウト期間が経過しています。これは、プールされたすべての接続が使用中で、プールの最大サイズに達したために発生した可能性があります。 – user148515

答えて

2

誤って入力したか、SqlConnectionを(SqlTransactionを渡すのではなく)Publishメソッドに渡しているために問題が発生している可能性があります。

SqlTransactionには、すべての更新プログラムで使用する接続プロパティがあります。

は、だから、これは誤解である場合には、いくつかの擬似コードを投稿してみ

// Create connection 
SqlConnection connection = ObtainSqlConnection() 

// Create transaction 
SqlTransaction sqlTransaction = connection.BeginTransaction(); 

try 
{  
    foreach (Action action in collectionOfActionsToPerform) 
    { 
     action.Publish(sqlTransaction) 
    } 

    sqlTransaction.Commit(); 
} 
catch 
{ 
    sqlTransaction.Rollback(); 
} 

のような何かをしたいです。

0

WebサイトMySpaceがSQL Serverテクノロジで使用する実装を見てください。彼らは何百ものデータベース間でデータベーストランザクションを管理するために、SQL Serverのサービスブローカを使用

http://www.microsoft.com/casestudies/Case_Study_Detail.aspx?CaseStudyID=4000004532

  • DAABは、エンタープライズライブラリの面では

取引にできるだけ小さなデータとしてアクセス

  • できるだけ短いトランザクションを保持:

    0

    いくつかのトランザクションのベストプラクティスがにありますSystem.Transaction awareなので、私はTransactionScopeを使用します。あなたが言ったことに基づいてのようなもの:

    Database database = DatabaseFactory.CreateDatabase(); 
    
    using (TransactionScope scope = 
        new TransactionScope(TransactionScopeOption.RequiresNew)) 
    { 
        foreach(MyClass myClass in myClasses) 
        { 
         myClass.Publish(database); 
        } 
    
        scope.Complete(); 
    } 
    

    この例は、エラー処理を持っていないと、トランザクションがロールバックする必要がある場合は、例外がスローされることを想定しています。

    あなたの取引には多数のレコードが含まれており、かなりの時間がかかりそうです。トランザクションで更新しているレコードの数はいくつですか?あなたの取引はどれくらい持続していますか?すべてのSQL文を1つのトランザクションに入れる必要があるか、それとも小さなトランザクションに分割することができますか?

    SQL文のプロファイリングを試みて、効率的であることを確認しましたか。また、過剰なロックを取り出さず、ロック/ブロッキングの問題がないことを確認してください。

    関連する問題