2010-01-21 3 views
1

У меня есть небольшое доказательство концепции распределенного транзакционного приложения, которое делает простую вставку в две таблицы - одну таблицу MS SQL Server, другую таблицу Informix Dynamic Server. Проблема возникает, когда возникает исключение. Если я использую драйвер OLE DB для Informix, все работает нормально - оба вкатывают назад; если я использую .NET Data Provider для Informix, вставка Informix не откат.Informix .NET Provider и TransactionScope не откатываются назад

Есть ли у кого-нибудь идеи относительно того, что происходит?

В фрагменте кода вы заметите прокомментированный метод 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(); 
    } 
} 

Connection Strings:

ответ

1

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

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

  • Добавить «завербовать = истина» в строке подключения
  • Добавить EnterpriseServicesInteropOption.Full в свой TransactionScope конструктор
+0

Отлично !! Изменение конструктора TransactionScope сделало трюк без дальнейших изменений. Спасибо. У меня уже было завербование = true в моей строке подключения, но я думаю, что я ввернул что-то, разместив свой XML. –

Смежные вопросы