Nhibernate BeginTransaction 使用 System.Transaction TransactionScope() 和 NpgSQL

问题描述

我正在尝试在环境事务中使用 NHibernate 会话。 现有代码使用 sql Server 连接并且工作正常。 现在我已经将它迁移到使用 Postgres 连接,但相同的测试代码失败了。 相关代码

单元测试代码

using (new TransactionScope())
            {                 
                    TRoot savedEntity;

                    using (var unit = UnitOfWorkFactory.Create())
                    {
                        savedEntity = SaveEntity(unit);

                        unit.Complete(); //calls transaction.Commit();
                    }

工作单元代码

public IUnitOfWork Create()
    {
        return Create(IsolationLevel.ReadCommitted);
    }

    public IUnitOfWork Create(IsolationLevel isolationLevel)
    {
        return new UnitOfWork(sessionFactoryConfigurer.Factory.OpenSession(),isolationLevel);
        
    }

工作单元实现代码

private readonly ISession session;
    private readonly ITransaction transaction;

    public UnitOfWork(ISession session,IsolationLevel isolationLevel)
    {
        this.session = session;

        transaction = session.BeginTransaction(isolationLevel);
    }

调用 session.BeginTransaction 时,代码失败:

“事务已在进行中;不支持嵌套/并发事务。” 在 Npgsql.NpgsqlConnection.BeginTransaction(隔离级别级别,布尔异步,CancellationToken 取消令牌)

我已经读到 NHibernate 会自动加入现有事务,所以我尝试不使用 BeginTransaction,但是代码在 transaction.Commit() 上失败:

“交易未成功启动” 在 NHibernate.Transaction.AdoTransaction.CheckBegun()

我在调试时注意到事务的 IsActive 属性始终为 false,但这对于 sql Server 连接和 Postgres 连接都是如此。 我已经尝试在现有事务中明确登记,设置连接字符串属性“Enlist=true”以及我发现的其他一些建议。

我们使用的是 NHibernate 5.2.7

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...