以下是我的代码的代表性片段,其中至少在我的部分,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循环的每次后续迭代中都看到了相同的异常。
想法?这种模式是否正确?
答案 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 字符串或二进制数据将被截断。声明一直如此 终止。