Поставщик Informix .NET и TransactionScope не откатываются - PullRequest
1 голос
/ 21 января 2010

У меня есть небольшое приложение для распределенных транзакций, проверяющее концепцию, которое выполняет простую вставку в две таблицы: одну - таблицу MS SQL Server, другую - таблицу Informix Dynamic Server. Проблема возникает, когда выдается исключение. Если я использую драйвер OLE DB для Informix, все работает нормально - обе вставки откатываются; если я использую провайдер данных .NET для 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();
    }
}

Строки подключения:

1 Ответ

1 голос
/ 21 января 2010

Я почти уверен, что поставщик ADO Informix .Net не поддерживает TransactionScope. Это не требование поставщика ADO.Net.

Вы можете заставить это работать, используя COM + и MSDTC, поскольку Informix поддерживает это. Вам нужно будет сделать следующее:

  • Добавить "enlist = true" в строку подключения
  • Добавьте EnterpriseServicesInteropOption.Full в ваш TransactionScope конструктор
...