2

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

それを処理するためのベストプラクティスは何ですか?

現在、次のことを行っています。

  1. DB接続とトランザクションの作成
  2. 実行するアクションを表すすべてのクラスをコレクションに入力します。コンストラクターを介して接続を渡します。
  3. try/catch で、すべてのアクション クラスをループし、その Publish() メソッドを呼び出します。
  4. 成功した場合はコミット (接続を閉じます)、エラーの場合はロールバックします (接続を閉じます)。

このプロセスには時間がかかる場合があり、プールされたデータベース接続が不足しているようです。トランザクションを管理するためのより良い方法はありますか?

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

4

3 に答える 3

2

タイプを間違えたか、(SqlTransaction を渡すのではなく) SqlConnection を 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();
}

これが誤解である場合は、疑似コードを投稿してみてください。

于 2009-07-31T15:01:12.077 に答える
0

Web サイト MySpace が SQL Server テクノロジで使用している実装を見てみましょう。

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

彼らは、SQL Server Service Broker を使用して、数百のデータベースにわたるデータベース トランザクションを管理しています。

于 2009-07-31T15:02:00.563 に答える
0

いくつかのトランザクションのベスト プラクティスは次のとおりです。

  • トランザクションをできるだけ短くする
  • トランザクションでできるだけ少ないデータにアクセスする

Enterprise Library に関して言えば、DAAB は System.Transaction 対応なので、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 ステートメントが効率的であることを確認するために、SQL ステートメントのプロファイリングを試みましたか。また、過剰なロックを取得していないこと、およびロック/ブロックの問題が発生していないことも確認してください。

于 2009-08-21T04:10:50.660 に答える