【问题标题】:Informix, NHibernate, TransactionScope interaction difficultiesInformix、NHibernate、TransactionScope 交互困难
【发布时间】:2010-01-22 21:13:37
【问题描述】:

我有一个小程序正在尝试使用 Informix .NET 提供程序将 NHibernate 插入包装到 TransactionScope 对象中的 Informix 数据库中。我收到下面指定的错误。没有 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 未处理 Message="无法关闭 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() 在 D:\Development\ScratchProject\HelloNHibernate\Employee.cs:line 73 中的 HelloNHibernate.Employee.OpenSession() 在 D:\Development\ScratchProject\HelloNHibernate\Employee.cs:line 53 中的 HelloNHibernate.Employee.TestTScope() 在 D:\Development\ScratchProject\HelloNHibernate\Program.cs:line 19 中的 HelloNHibernate.Program.Main(String[] args) 在 System.AppDomain._nExecuteAssembly(程序集程序集,字符串 [] 参数) 在 System.AppDomain.ExecuteAssembly(字符串 assemblyFile,证据 assemblySecurity,String [] args) 在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 在 System.Threading.ThreadHelper.ThreadStart_Context(对象状态) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback 回调,对象状态) 在 System.Threading.ThreadHelper.ThreadStart() 内部异常:IBM.Data.Informix.IfxException Message="ERROR - 没有可用的错误信息" 来源="IBM.Data.Informix" 错误代码=-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) 内部异常:

【问题讨论】:

    标签: nhibernate informix transactionscope


    【解决方案1】:

    当您在会话之后创建事务或使用 session.begintransaction 时,它可能会起作用

    【讨论】:

    • transactionscope/opensession/begintransaction 没有产生影响,因为在 opensession 中创建工厂期间发生了错误。但是,opensession/transactionscope 似乎可以按预期工作,尽管对我来说似乎倒退了。
    • 会话打开和关闭事务用来提交的连接。
    【解决方案2】:

    您的 Informix 数据库设置是否带有日志记录?如果不是,则事务将根本不起作用,这是预期的行为。

    【讨论】:

    • 谢谢。我已经让它工作了。关键是首先打开 NHibernate Session,然后在其中创建 TransactionScope 对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    相关资源
    最近更新 更多