【发布时间】:2013-05-03 01:57:33
【问题描述】:
我需要在一个事务中加入多个 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 个。为了解决这个问题,我想创建短期会话并快速处理它们。
但是,整个过程被包装到一个事务中。如果我用自己的连接创建独立的后续会话,它们会碰到第一个事务持有的表锁并冻结。为了解决这个问题,我需要在同一个事务中运行这些会话。
【问题讨论】:
标签: .net sql nhibernate