2011-10-28 15 views
0

最後にトランザクションのロールバックを行う統合テストがあります。最近、テストにHQLコマンドを追加しました。私がそれをやろうとしたら、HQLコマンドによってトランザクションがコミットされたかのように、テストの他の書き込みの多くがデータベースにコミットされ始めました。 Rollbackコマンドは最後に呼び出され、例外はスローされませんが、データはいずれにしてもコミットされます。 HQLコマンドがトランザクションをコミットする可能性のある方法はありますか?トランザクションコミットを引き起こすHQLコマンド

HQLコマンドではなくSQLコマンドを使用するとエラーは発生しません。

環境:ASP.Net、NHibernate、Oracle。

+0

これは同じセッションで、他のすべての書き込み操作が開かれたトランザクションですか? – Firo

答えて

1

flushとcommitを混同しています。フラッシュは、HibernateがSQL文を実行してデータベース内の行を挿入/更新/削除するときです。コミットとは、挿入、更新、削除が永続的になり、他のトランザクションから見えるときです。

メモリ内で変更されたが状態はまだデータベースに書き込まれていないエンティティをクエリで返さなければならないため、HQLクエリが実行されたときにフラッシュが行われます。例えば

は、次の擬似コード

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

あなたが最後のクエリはあなただけの赤い行われたすべての自転車を返却したいと思うがあるとします。したがって、NHibernateは最後のクエリを発行する前にバイクをデータベースにフラッシュして、クエリがそれらを見つけるようにします。

+0

あなたが言っていることは分かりません。 NHibernateがデータベースにフラッシュすると、ロールバックが失敗しますか? –

+0

いいえ、私はちょうどあなたがコミットだと思っていることは、実際にはフラッシュであると言っています。 HQLクエリが実行される前にSQL文の挿入と更新が記録されているだけで、トランザクションがコミットされたわけではありません。これは、NHibernateがデータベースに書き込むことです。最後にロールバックに間違いがないとあなたは言った。コミットは全くありません。 –

+0

ロールバックにエラーはありませんが、HQLデータはロールバック後にDBに残ります。それを明確にするために質問を編集します。 –

関連する問題