Трудности взаимодействия с Informix, NHibernate, TransactionScope - PullRequest
1 голос
/ 23 января 2010

У меня есть небольшая программа, которая пытается обернуть вставку NHibernate в базу данных Informix в объекте TransactionScope, используя поставщик Informix .NET. Я получаю ошибку, указанную ниже. Код без объекта TransactionScope работает - в том числе, когда вставка помещается в транзакцию сеанса NHibernate. Есть идеи, в чем проблема? Кстати, без EnterpriseServicesInterop поставщик Informix .NET не будет участвовать в транзакции TransactionScope (проверено без участия NHibernate).

Фрагмент кода:

    public static void TestTScope()
    {
        Employee johnp = new Employee { name = "John Prideaux" };

        using (TransactionScope tscope = new TransactionScope(
            TransactionScopeOption.Required,
            new TransactionOptions() { Timeout = new TimeSpan(0, 1, 0),
                IsolationLevel = IsolationLevel.ReadCommitted },
            EnterpriseServicesInteropOption.Full))
        {     
            using (ISession session = OpenSession())
            {
                session.Save(johnp);
                Console.WriteLine("Saved John to the database");
            }
        }
        Console.WriteLine("Transaction should be rolled back");
    }

    static ISession OpenSession()
    {
        if (factory == null)
        {
            Configuration c = new Configuration();
            c.AddAssembly(Assembly.GetCallingAssembly());
            factory = c.BuildSessionFactory();
        }
        return factory.OpenSession();
    }

    static ISessionFactory factory;

Трассировка стека:

NHibernate.ADOException не было обработано Сообщение = "Не удалось закрыть соединение IBM.Data.Informix.IfxConnection" Источник = "NHibernate" Трассировки стека: в NHibernate.Connection.ConnectionProvider.CloseConnection (IDbConnection conn) в NHibernate.Connection.DriverConnectionProvider.CloseConnection (IDbConnection conn) в NHibernate.Tool.hbm2ddl.SuppliedConnectionProviderConnectionHelper.Release () в NHibernate.Tool.hbm2ddl.SchemaMetadataUpdater.GetReservedWords (диалект диалекта, IConnectionHelper connectionHelper) в NHibernate.Tool.hbm2ddl.SchemaMetadataUpdater.Update (ISessionFactory sessionFactory) в NHibernate.Impl.SessionFactoryImpl..ctor (Конфигурация cfg, отображение IMapping, Настройки параметров, прослушиватели EventListeners) в NHibernate.Cfg.Configuration.BuildSessionFactory () в HelloNHibernate.Employee.OpenSession () в D: \ Development \ ScratchProject \ HelloNHibernate \ Employee.cs: строка 73 в HelloNHibernate.Employee.TestTScope () в D: \ Development \ ScratchProject \ HelloNHibernate \ Employee.cs: строка 53 в HelloNHibernate.Program.Main (String [] args) в D: \ Development \ ScratchProject \ HelloNHibernate \ Program.cs: строка 19 в System.AppDomain._nExecuteAssembly (сборка сборки, аргументы String []) в System.AppDomain.ExecuteAssembly (String assemblyFile, Evidence assemblySecurity, String [] args) в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly () в System.Threading.ThreadHelper.ThreadStart_Context (состояние объекта) в System.Threading.ExecutionContext.Run (ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта) в System.Threading.ThreadHelper.ThreadStart () InnerException: IBM.Data.Informix.IfxException Сообщение = "ОШИБКА - информация об ошибке недоступна" Источник = "IBM.Data.Informix" ErrorCode = -2147467259 Трассировки стека: в IBM.Data.Informix.IfxConnection.HandleError (IntPtr hHandle, SQL_HANDLE hType, RETCODE retcode) в IBM.Data.Informix.IfxConnection.DisposeClose () в IBM.Data.Informix.IfxConnection.Close () в NHibernate.Connection.ConnectionProvider.CloseConnection (IDbConnection conn) InnerException:

Ответы [ 2 ]

1 голос
/ 30 апреля 2010

Ваша база данных Informix настроена на ведение журнала? Если это не так, транзакции вообще не будут работать, это ожидаемое поведение.

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

Вероятно, это будет работать, когда вы создаете транзакцию после сеанса или используете session.begintransaction

...