NHibernate和Transactions - “交易未连接或已断开连接”

时间:2013-01-15 15:52:44

标签: transactions fluent-nhibernate

以下是我的代码的代表性片段,其中至少在我的部分,transaction.Rollback()语句会抛出异常。

异常类型为NHibernate.TransactionException,消息为“事务未连接或已断开连接。”堆栈跟踪如下所示:NHibernate.Transaction.AdoTransaction.CheckNotZombied() at NHibernate.Transaction.AdoTransaction.Rollback()

IEmployeeService employeeService = new EmployeeService(session);
var people = ReadFromFile('c:\temp.csv');

for (var person in people)
{
    ITransaction transaction = session.BeginTransaction();
    try
    {
        employeeService.Update(person);

        employeeService.CheckForRecursion();

        transaction.Commit();
    }
    catch(Exception exp)
    {
        if (!transaction.WasRolledBack)
            transaction.Rollback();
    }
}

CheckForRecursion使用一些SQL来查找上次更新引入的任何递归,如果是这样我想要撤消。当引入递归时,一个异常从SQL中冒出来,这是正确的,我抓住它并尝试回滚。那是我遇到错误的时候。

我已经将tryback包装在try catch中,所以整个过程可以继续进行,但是我在for循环的每次后续迭代中都看到了相同的异常。

想法?这种模式是否正确?

2 个答案:

答案 0 :(得分:1)

为什么不处理交易?

using (ITransaction transaction = session.BeginTransaction())
{
    employeeService.Update(person);

    employeeService.CheckForRecursion();

    transaction.Commit();
}

发生异常时,您应该销毁会话。这个变化是在这个人身上做出的,并没有被撤消。当它无法存储时,它在内存中无效。

答案 1 :(得分:1)

当表上的触发器引发错误时,我收到此错误。 我修复了触发器,交易错误就消失了。

我在输出窗口中显示了NHibernate生成的SQL显示,因此我使用了最后生成的sql语句并在查询工具中运行它。触发器引发了有关截断字符串值的错误。

这是一个带有触发器的表的示例,它会在NHibernate中导致这种错误。

CREATE TABLE myTable (
    id int IDENTITY(1,1) NOT NULL,
    ThisIsA10CharField varchar(10),
    CONSTRAINT myTable_pk PRIMARY KEY CLUSTERED (id));
GO

CREATE TRIGGER myTable_MakeError ON myTable AFTER INSERT AS 
BEGIN
    INSERT INTO myTable (ThisIsA10CharField) values ('this will raise a truncate error')
END
GO

INSERT INTO mytable (ThisIsA10CharField) values ('x')
  

Msg 8152,Level 16,State 14,Procedure myTable_MakeError,Line 4   字符串或二进制数据将被截断。声明一直如此   终止。