我需要在一个事务中加入多个 NHibernate 会话。目前我执行以下操作:
1)创建SQL连接,dbConn;
2) 调用ISession session = ISessionFactory.OpenSession(dbConn)创建第一个会话;
3) 调用session.BeginTransaction()开始事务。
4)稍后在代码中,我创建一个具有相同连接的新会话:
ISession session2 = ISessionFactory.OpenSession(dbConn)
当我尝试对 session2 运行任何查询时,我收到以下错误消息:
当分配给命令的连接处于挂起的本地事务中时,ExecuteReader 要求该命令具有事务。该命令的 Transaction 属性尚未初始化。
NHibernate 似乎没有在打开的事务中加入第二个 ISession(或者更具体地说,它为该会话创建的 Command 对象),即使它确实重用了相同的连接。
有没有办法在同一个事务中拥有多个会话?
我不能使用单个会话,因为我有一个长时间运行的任务,它加载并创建了超过 100 万个对象。如果我使用一个 ISession,由于 NHibernate Flushes 的性能下降,性能会从每秒 3000 个数据库请求下降到 20 个。为了解决这个问题,我想创建短期会话并快速处理它们。
但是,整个过程被包装到一个事务中。如果我用自己的连接创建独立的后续会话,它们会碰到第一个事务持有的表锁并冻结。为了解决这个问题,我需要这些会话在同一个事务中运行。