none
C#での分散DBの2フェーズコミットの設定方法について RRS feed

  • 質問

  • VS2005(C#)-SQLServer2005の環境にて分散DBの2フェーズコミットができるかどうか調査しているのですが、2つめのDBへの接続のオープン時に”トランザクションはすでに、暗黙的または明示的にコミットされているかまたは中止されています。”と表示され、うまくいきません。
    夫々のDBには単独だと接続可能で、また同一マシンのDBであればDbConnectionを2つ開いてもトランザクションの制御ができていることを確認しています。

    以下の手続きを行っているのですが、何か問題等があればご教示ください。
    よろしくお願いします。

    1.Windows2003の管理ツール→コンポーネントサービスからMSDTCのネットワークDTCアクセスをオンに変更(2台とも)

    2.マシンの再起動

    3.キー・ペアを作成(sn.exe -k test.snk)

    4.アプリケーションのアセンブリへの登録
      [assembly: AssemblyKeyFile("test.snk")]
     [assembly: ComVisible(true)]

    5.以下のようなコードを実行(一部抜粋)

    using System.EnterpriseServices;

    namespace DBTransaction
    {
        [Transaction(TransactionOption.Required)]
        [EventTrackingEnabled(true)]
        public class DB : ServicedComponent
        {
            private string connStr1 = @"Data Source=*;Initial Catalog=*;Persist Security Info=True;User ID=*;Password=*";
            private string connStr2 = @"Data Source=*;Initial Catalog=*;Persist Security Info=True;User ID=*;Password=*";
            private string cmdStr = @"insert into TestTab1 values (@a, @b)";

            [AutoComplete]
            public void Test()
            {
                try
                {
                    SqlConnection conn1 = new SqlConnection(connStr1);
                    conn1.Open();
                    SqlCommand command = new SqlCommand(cmdStr, conn1);
                    SetParam(command, "@a", "5");
                    SetParam(command, "@b", "5");
                    command.ExecuteNonQuery();
                    conn1.Close();

                    SqlConnection conn2 = new SqlConnection(connStr2);
                    conn2.Open();
                    SqlCommand command2 = new SqlCommand(cmdStr, conn2);
                    SetParam(command2, "@a", "5");
                    SetParam(command2, "@b", "5");
                    command2.ExecuteNonQuery();
                    conn2.Close();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    throw ex;
                }
            }
        }
    }

    2006年7月26日 8:55

すべての返信