using (ITransaction trans = Session.BeginTransaction()) { try { Session.Save(new Company { CompanyName = "宁夏分公司A", Assets = 1000000.1m, IsEnable = 1, Sort = 22, CreateDate = "" }); using (ITransaction trans2 = Session.BeginTransaction()) { Session.Save(new Company { CompanyName = "宁夏分公司B", Assets = 1000000.1m, IsEnable = 1, Sort = 2121, CreateDate = "" }); trans2.Commit(); } trans.Commit(); } catch (HibernateException) { trans.Rollback(); return false; } } return true;
为什么NH不允许这样的 事务嵌套呢?
无法访问已释放的对象。 对象名:“AdoTransaction”。 说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.ObjectDisposedException: 无法访问已释放的对象。 对象名:“AdoTransaction”。 源错误: 行 128: } 行 129: 行 130: trans.Commit(); 行 131: } 行 132: catch (HibernateException)
using (ITransaction trans2 = Session.BeginTransaction())
using 关键字会自动释放对象。这里的主要问题出在Session.BeginTransaction() 这里,当你用了上面这句using (ITransaction trans2 = Session.BeginTransaction()), trans 和 trans2 就已经指向了同一个初始化的transaction. 当这个using 释放到trans2的时候,也就是把trans 给释放了。
确实是这样的
NH不支持这样的 嵌套
现在就是在想办法 如何让它支持这样的 “嵌套”
@show_show: 请参考:http://www.sjtsoft.com/sjblog/article.asp?id=534
这个问题也是困扰我很久了,不知道有没有高手来解决啊?