nhibernate - 刷新 NHibernate,同时仍然允许事务回滚

标签 nhibernate transactions flush

我正在尝试将 NHibernate 与未使用 NHibernate 映射的遗留实体一起使用。有时这意味着我需要手动将 NHibernate 数据刷新到数据库,这样当我尝试将遗留实体与 NHibernate 映射的实体连接时,我就不会收到外键异常。

当这发生在需要回滚的事务中时,就会出现问题。从 NHibernate 刷新的数据不会回滚。

对此我能做些什么吗?

更新

仍然很好奇如何做到这一点 - 我不相信给出的任何一个答案都可以解决这个问题。我需要调用 Flush()。问题是,如何回滚已刷新的数据?

最佳答案

检查这个:Force query execution without flush/commit

我似乎有同样的问题,我会刷新然后我会回滚,但一些数据会保留在数据库中。但是,我的代码中有一些部分会调用提交,并且无法回滚。将接受的答案的代码片段视为事务、刷新、回滚和提交的正确用法,并考虑到这种模式可以扩展......

在单个工作单元中(即,我们将 Web 应用程序中的请求视为单个工作单元,并且该请求中发生的所有内容都存在于提交 onEndRequest 的单个事务中):

  • 您调用_sessionFactory.OpenSession() , _session.BeginTransaction() , _session.CommitTransaction()_session.CloseSession()只有一次。
  • 您可以调用_session.Flush()_session.RollBackTransaction()任意多次,但 Flush() 会在 Commit 上自动调用。当您需要进行查询并确保获取的数据不会过时时,您可能需要调用 Flush。
  • 请注意,一旦提交事务被提交,之后的所有操作都不会发生在该事务上。相反,NHibernate 将在后台创建必要的事务 (http://www.nhprof.com/Learn/Alerts/DoNotUseImplicitTransactions)
    您已经在跟踪一致性和可能的​​逻辑完整性时遇到了问题
  • 如果您确实必须在工作单元的中间调用 commit,强烈建议此时创建一​​个新事务,以便您可以明确地管理它
  • 更好的是尝试嵌套事务据称会允许部分提交;您可以回滚“根”事务,所有更改都将被还原。我还没有真正测试过 .NET 和 SQL Server 的这个特性,尽管数据库中的嵌套事务本身还有很多不足之处,而且我不知道 ADO.NET 如何准确地检测这个特性。

  • 从 1.2 开始,所有版本的 NHibernate 都对第 1 点到第 4 点进行了测试。

    关于nhibernate - 刷新 NHibernate,同时仍然允许事务回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1761026/

    相关文章:

    linux-device-driver - Linux 内核 flush_cache_range() 调用似乎什么都不做

    c# - N休眠: QueryOver in generic method

    nhibernate - 从域对象访问服务的规则

    c# - NHibernate 多对多关系表中的附加字段

    c# - 跨多个事务管理 SQL 数据库连接

    c# - 是否可以在不允许升级到 DTC 的情况下将 .NET 的 TransactionScope 与 Sql Server 2005 一起使用?

    jpa - JTA 事务提交太早,使用约束时失败

    c - 如何清除 C 中的输入缓冲区?

    sql - HQL/JPQL - FROM 上的嵌套选择

    java - 什么时候不使用 EntityManager.flush()?