1

私は、2 つのテーブル (1 つは MS SQL Server テーブル、もう 1 つは Informix Dynamic Server テーブル) に単純な挿入を行う、概念実証の分散トランザクション アプリケーションを少し持っています。問題は、例外がスローされたときに発生します。Informix 用の OLE DB ドライバーを使用すると、すべて正常に動作します。両方の挿入がロールバックします。.NET Data Provider for Informix を使用すると、Informix 挿入がロールバックしません。

誰が何が起こっているかについて何か考えを持っていますか?

コード スニペットでは、コメント アウトされた EnlistTransaction() メソッドに気付くでしょう。明示的に呼び出すと、メソッドが実装されていないことを示す例外が発生します。

コードスニペット:

private void doTransaction(Boolean commitIndicator)
{
    using (TransactionScope tscope = new TransactionScope())
    {
        using (SqlConnection cn = new SqlConnection { ConnectionString = sql2008Settings.ConnectionString })
        {
            cn.Open();

            using (SqlCommand cmd = cn.CreateCommand())
            {
                cmd.CommandText = "insert into uom (uom) values ('Test')";
                int count = cmd.ExecuteNonQuery();
            }
        }
        using (IfxConnection cn = new IfxConnection())
        {
            cn.ConnectionString = idnSettings.ConnectionString;
            cn.Open();
            //cn.EnlistTransaction(Transaction.Current);
            using (IfxCommand cmd = cn.CreateCommand())
            {
                cmd.CommandText = "insert into table_ (code_, description) values ('JEP', 'Test')";
                int count = cmd.ExecuteNonQuery();
            }
        }
        if (commitIndicator)
        {
        }
        else
        {
            throw new Exception("planned failure");
        }
        tscope.Complete();
    }
}

接続文字列:

4

1 に答える 1

1

Informix .Net ADO Provider が TransactionScope をサポートしていないことは確かです。これは、ADO.Net プロバイダーの要件ではありません。

Informix は COM+ と MSDTC をサポートしているため、COM+ と MSDTC を使用してこれを機能させることができます。次のことを行う必要があります。

  • 接続文字列に「enlist=true」を追加します
  • コンストラクターに追加EnterpriseServicesInteropOption.FullするTransactionScope
于 2010-01-21T17:51:31.847 に答える