У меня есть небольшое доказательство концепции распределенного транзакционного приложения, которое делает простую вставку в две таблицы - одну таблицу 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:
Отлично !! Изменение конструктора TransactionScope сделало трюк без дальнейших изменений. Спасибо. У меня уже было завербование = true в моей строке подключения, но я думаю, что я ввернул что-то, разместив свой XML. –