1

ビジネス層でTransactionScopeクラスを使用して、データアクセス層でのデータベース操作を管理したいと考えています。

これが私のサンプルコードです。実行すると、dtcを有効にしようとします。dtcを有効にせずに操作したい。

https://entlib.codeplex.com/discussions/32592の記事をすでに確認しました。それは私にはうまくいきませんでした。私はこのテーマに関する多くの記事を読みましたが、それらのどれも実際にエンタープライズライブラリに触れていないか、私は見ませんでした。

ちなみに、私はdotnet sql clientを使用してTransactionScopeを使用することができ、それはかなりうまく機能します。

SampleInsert()メソッドの内部は何でしょうか?

ありがとう、

ビジネスレイヤー方式:

public void SampleInsert()
        {
            using (TransactionScope scope = new TransactionScope())
            {
                Sample1DAL dal1 = new Sample1DAL(null);
                Sample2DAL dal2 = new Sample2DAL(null);
                Sample3DAL dal3 = new Sample3DAL(null);
                dal1.SampleInsert();
                dal2.SampleInsert();
                dal3.SampleInsert();
                scope.Complete();
            }
        }

データアクセス層方式:

//sampleInsert method structurally same for each 3 dal

public void SampleInsert()
        {
            Database database = DatabaseFactory.CreateDatabase(Utility.DATABASE_INFO); ;
            using (DbConnection conn = database.CreateConnection())
            {
                conn.Open();
                DbCommand cmd = database.GetStoredProcCommand("P_TEST_INS", "some value3");
                database.ExecuteNonQuery(cmd);
            }
        }
4

2 に答える 2

2

はい、1つのTransactionScope内に3つのDB接続を作成しているため、これによりdtcが有効になります。同じTransactionScope内に複数のDB接続が作成されると、ローカルトランザクションは分散トランザクションにエスカレートするため、dtcは分散トランザクションを管理できるようになります。TransactionScope全体に対して1つのDB接続のみが作成されるようにする必要があります。これがあなたにアイデアを与えることを願っています。

于 2012-07-24T17:00:46.980 に答える
0

クエリアナライザーを調べて起動した後、SampleInsert()本体を次のように変更しましたが、機能しました。問題は、データベースにアクセスするたびに新しい接続を開くことについて倫理学が述べたとおりでした。

public void SampleInsert()
        {
            Database database = DatabaseFactory.CreateDatabase(Utility.DATABASE_INFO);
            using (DbCommand cmd = database.GetStoredProcCommand("P_TEST_INS", "some value1"))
            {
                database.ExecuteNonQuery(cmd);
            }
        }
于 2012-07-25T05:24:14.923 に答える