【问题标题】:HQL command causing a transaction commit导致事务提交的 HQL 命令
【发布时间】:2011-12-17 14:12:54
【问题描述】:

我有一个在最后执行事务回滚的集成测试。最近我在测试中添加了一个 HQL 命令。一旦我这样做了,测试中的许多其他写入开始提交到数据库,就好像 HQL 命令导致事务被提交一样。回滚命令在最后被调用,并且不会抛出异常,但无论如何都会提交数据。是否有任何方式 HQL 命令可以导致事务自行提交?

如果我使用 SQL 命令而不是 HQL 命令,则不会发生错误。

环境:ASP.Net、NHibernate、Oracle。

【问题讨论】:

  • 是否是同一个会话,事务是否在所有其他写入操作之前打开?

标签: nhibernate transactions hql


【解决方案1】:

您混淆了刷新和提交。刷新是 NHibernate 执行 SQL 语句以在数据库中插入/更新/删除行。提交是指这些插入/更新/删除变为永久且对其他事务可见。

在执行 HQL 查询时会完成刷新,因为查询可能必须返回一些已在内存中修改但其状态尚未写入数据库的实体。

例如,假设你有以下伪代码

1. select all blue bikes
2. change them all to red
3. select all red bikes

您可能希望最后一个查询返回您刚刚设置为红色的所有自行车。因此 NHibernate 在发出最后一个查询之前将自行车刷新到数据库中,以便查询找到它们。

【讨论】:

  • 我不明白你在说什么。 NHibernate 刷新到数据库会导致回滚失败吗?
  • 没有。我只是说你认为的提交实际上是同花顺。仅仅因为您看到在执行 HQL 查询之前记录了插入和更新 SQL 语句,并不意味着事务已提交。只是 NH​​ibernate 写入数据库。你自己说最后回滚没有任何错误。根本没有提交。
  • 回滚没有错误,但是回滚后HQL数据还在DB中。我将编辑我的问题以澄清这一点。
猜你喜欢
  • 1970-01-01
  • 2017-09-12
  • 2018-12-13
  • 2016-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
相关资源
最近更新 更多