我有一个集成测试,最后执行事务回滚。最近我在测试中添加了一个HQL命令。一旦我这样做,测试中的许多其他写入开始被提交到数据库,就像HQL命令导致事务被提交一样。最后调用Rollback命令,不会抛出异常,但无论如何都会提交数据。 HQL命令是否有任何方式可以导致事务自行提交?
如果我使用SQL命令而不是HQL命令,则不会发生错误。
环境:ASP.Net,NHibernate,Oracle。
答案 0 :(得分:1)
你混淆了刷新和提交。刷新是指NHibernate执行SQL语句以插入/更新/删除数据库中的行。提交是指这些插入/更新/删除变为永久性且对其他事务可见。
执行HQL查询时会执行刷新,因为查询可能必须返回一些已在内存中修改但尚未将其状态写入数据库的实体。
例如,假设您有以下伪代码
1. select all blue bikes
2. change them all to red
3. select all red bikes
您希望最后一个查询返回刚刚变成红色的所有自行车。所以NHibernate在发出最后一个查询之前将自行车刷新到数据库,以便查询找到它们。