nhibernate - 我可以在分布式事务中使用 NHibernate 的 AdoNetTransactionFactory 吗?

标签 nhibernate distributed-transactions

我正在处理一个与 WCF 服务中的 NHibernate 和分布式事务相关的奇怪问题。见 Deadlocks causing 'Server failed to resume the transaction' with NHibernate and distributed transactions更多细节。

似乎可以解决我的问题的一件事是使用 NHibernate 的 AdoNetTransactionFactory,而不是 AdoNetWithDistributedTransactionsFactory。

我相信 AdoNetWithDistributedTransactionsFactory 与使 NHibernate 的二级缓存机制正常工作有关,但我们没有使用它。将 AdoNetTransactionFactory 与分布式事务一起使用还存在哪些(如果有)其他问题?

谢谢你的时间!

最佳答案

我注意到您从其他问题/答案中提到:

SqlConnection class is not thread-safe, and that includes closing the connection 
on a separate thread. Based on this response we have filed a 
bug report for NHibernate.

但是,来自 NHibernate's documentation :
11.2. Threads and connections

在创建 NHibernate Session 时,您应该遵守以下做法:
  • 切勿为每个数据库连接创建多个并发 ISession 或 ITransaction 实例。

  • 为每个事务为每个数据库创建多个 ISession 时要格外小心。 ISession 本身会跟踪对加载对象所做的更新,因此不同的 ISession 可能会看到陈旧的数据。

  • ISession 不是线程安全的!永远不要在两个并发线程中访问同一个 ISession。 ISession 通常只是一个工作单元!

    如果您尝试与 NHibernate 建立多线程连接,那么它可能无法正常工作。您是否考虑过不同的 ORM,例如 Entity Framework ?

    不管你选择什么 ORM,数据库连接都不是线程安全的。这是普遍的。

    “许多数据库驱动程序不是线程安全的。使用单例意味着如果你有很多线程,它们将共享相同的连接。单例模式不会给你线程安全。它只是允许多个线程轻松共享一个“全局”实例。” - https://stackoverflow.com/a/6507820/1026459
  • 关于nhibernate - 我可以在分布式事务中使用 NHibernate 的 AdoNetTransactionFactory 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8582206/

    相关文章:

    nhibernate - 在 nHibernate : "Index was out of range." 中更新时出错

    java - 如何调用 IDL 接口(interface)上未指定的方法? [科尔巴,JAVA]

    c# - Nhibernate eager fetch for children -> 孙子

    winforms - NHibernate/CaSTLe.ActiveRecord ; session 管理;窗体

    c# - NHibernate 如何确定是插入还是更新记录?

    database - 分布式事务-为什么我们将记录保存到文件系统?

    c# - 使用 WCF 的分布式事务

    c# - Sqlite "No such table"保存对象时

    ado.net - 为什么 Azure 数据库在事务方面表现更好

    sql-server - 查询链接服务器上的全局临时表