8

分散トランザクションのサポートなしで System.Transactions プログラミング モデルを使用することは可能ですか?

何かのようなもの

  TransactionConfig.DisablePromotion = true;
4

3 に答える 3

11

いいえ、プロパティまたは構成を介してトランザクションプロモーションを無効にすることはできません。トランザクションの昇格を無効にする唯一の方法は、トランザクションが分散トランザクションに昇格する原因となる条件を回避することです。

トランザクション管理のエスカレーションを回避するには、次のことを行う必要があります。

  • データベースとしてSQLServer2005以降を使用する

  • SQL Server 2005の場合、トランザクションの存続期間中は1つのデータベース接続のみを使用します。(SQL Server 2008では、プロモーションを行わずにトランザクション内で複数の接続を使用できます。)

  • 1つのデータベースにのみアクセスする

  • アプリケーションドメイン間でトランザクションを渡さない


ルールの理由は、トランザクション のACIDプロパティを確認するためです。

例として、(コードスニペットのように)トランザクションをプロモートしないように指定できるが、コードが2つのデータベースにアクセスすると仮定します(コードは1つのデータベースのみを使用します)。これで、分散トランザクションを使用しないように指定し、トランザクションを開始し、2つのデータベースの両方をその1つの作業単位内に配置するように指定しました。トランザクションのACIDプロパティと、分散トランザクションを回避したいという要望との間に矛盾があります。これを処理するには、トランザクションを分散トランザクションにプロモートする(やりたくないと言った)か、例外をスローする(の整合性を保証できないため)の2つの方法があるように思われます。取引)。

したがって、アプリケーションがトランザクションをプロモートしないようにするには、エスカレーションルールに従う必要があるため、DisablePromotionプロパティを使用してもあまり価値はありません。

本当に必要な場合は、DistributedTransactionStartedイベントを処理し、分散トランザクションの開始時に例外をスローすることができます。それはあなたのアプリケーションが分散トランザクションを使用していないことを保証しますが、それはおそらくあなたが望むものではありません。

于 2009-10-16T05:46:42.623 に答える
3

プロモーションを無効にする直接的な方法はないと思います。トランザクションがプロモートされる原因となる状況を確認することをお勧めします。Juval Lowyは、System.Transactionsに関する優れたホワイトペーパー(ここからもダウンロード可能)を作成しました。彼はプロモーションルールを詳細にカバーしています。

于 2009-10-09T09:01:41.363 に答える
1

MSDTC サービスを無効にして、次のコードを使用しています。

var txOpts = new TransactionOptions
          {
            IsolationLevel = IsolationLevel.ReadCommitted, 
            Timeout = TimeSpan.FromMinutes(10)};

using (var tx = new TransactionScope(TransactionScopeOption.Suppress, txOpts))
{
  using (var db1 = new ObjectContext(connection1))
  {
    db1.Connection.Open();
    using (var db1tx = db1.Connection.BeginTransaction(
                                System.Data.IsolationLevel.ReadCommitted))
    {
      using (var db2 = new ObjectContext(connection2))
      {
        db2.Connection.Open();
        using (var db2tx = db2.Connection.BeginTransaction(
                          System.Data.IsolationLevel.ReadCommitted))
        {
          // do stuff

          db1.SaveChanges(false);
          db2.SaveChanges(false);

          db1tx.Commit();
          db2tx.Commit();
          tx.Complete();
        }
      }
    }
  }
}
于 2013-03-18T22:14:34.713 に答える