NHibernate嵌套事务阻塞

时间:2009-05-07 17:04:24

标签: nhibernate transactions

我有一个NHibernate事务做了一些工作,并调用遗留方法,该方法使用DBTransactions来调用多个存储过程。如果这些遗留方法调用中的任何一个失败,则NHibernate事务应该回滚。

问题是Legacy方法正在使用NHibernate事务正在创建的数据库中的数据。这导致Legacy代码的SQL进程在等待Nhibernate进程时锁定。 Nhibernate进程正在等待Legacy SQL进程完成,从而导致死锁。

我已尝试对两个事务使用ReadUncommitted,但这不起作用。

我尝试使用NHibernate in Action中的建议使用System.EnterpriseServices来设置分布式事务,但这似乎也不起作用。

我不确定从哪里开始。

1 个答案:

答案 0 :(得分:1)

您可以按照首选顺序执行以下操作之一。

  1. 如果你的NHibernate工作是第一位的(就执行顺序而言),你需要让你的遗留方法使用你的NHibernate数据库连接。 ISession公开了一个Connection属性,您可以将该属性传递给旧的ADO代码。

  2. 如果这更容易,反之亦然。只要它们共享相同的连接,您就可以在同一事务上下文中执行两组数据访问。 ISessionFactory.OpenSession()有一个带有IDbConnection实例的重载。

  3. 在启动旧方法或NHibernate方法之前启动环境隐式事务。完成Nhibernate和遗留代码后,可以通过完成环境事务同时提交它们。 (我只是把这个放在第3位,因为实施它可能需要比1或2更长的时间)请参阅MSDN了解如何进行此操作。

  4. 如果你真的陷入困境并使用SQL Server ,你可以这样做,但这真的很讨厌。您可以将两个单独的连接统一到同一个数据库事务中。我还找不到关于如何做到这一点的链接,所以如果你有足够的力气去尝试它,请回复!