【问题标题】:NHiberate nested transaction blockingNHirate 嵌套事务阻塞
【发布时间】:2009-05-07 17:04:24
【问题描述】:

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

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

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

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

我不确定从这里去哪里。

【问题讨论】:

    标签: nhibernate transactions


    【解决方案1】:

    您可以按优先顺序降序执行一些操作。

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

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

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

    4. 如果你真的卡住了并且使用 SQL Server,你可以这样做,但这真的很糟糕。您可以将两个单独的连接合并到同一个数据库事务中。我还没有找到关于如何做到这一点的链接,所以如果你绝望地尝试一下,请回帖!

    【讨论】:

    • 感谢您的帮助。由于系统当前的设计方式,我选择了选项 3。我使用 TransactionScope 而不是 NHibernate 或 ADO Transactions。在 TransactionScope 完成之前刷新,然后完成事务。再次感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    • 2017-12-28
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多