2

1つのセッションを保持したいのですが、トランザクションをロールバックすると、トランザクションはisActive = falseになるため、同じトランザクションを使用して次のステートメントでコミットおよびロールバックすることはできません。次に、新しいトランザクションを作成する必要がありますが、ここで何が問題になっていますか?

        var session = NHibernateHelper.OpenSession();/* It returns new session. */
        var transaction1 = session.BeginTransaction();
        var list1 = session.Query<Make>().ToList(); /* It returs 4 records. */
        session.Delete(list1[2]);

        /* After Rollback, transaction is isActive=false so I can not commit 
         * and rollback from this transaction in future. so I need to create new transaction.
         */
        transaction1.Rollback();

        var transaction2 = session.BeginTransaction();

        /* It returns 3 records. 
         * I am not getting object(which was deleted but after that rollback) here why ? 
         */
        var list2 = session.Query<Make>().ToList(); 

誰もがここで何が間違っているのか知っていますか?ロールバックされた削除済みオブジェクトを取得していません。

4

2 に答える 2

0

理解するのに少し時間がかかりましたが、解決策は非常に簡単です。

Flush内にがないためtransaction1、SQLは内でDELETE自動的に実行されます。transaction2SELECT

この動作は予想されます。

于 2012-09-03T00:32:36.267 に答える
0

フラッシングとは、NHibernateがすべての変更がDBに永続化されることを確認することを意味します。つまり、必要なすべてのSQLステートメントが実行され、セッションがDBと同期していることを確認します。ISessionは、ADO.NET接続の状態をメモリに保持されているオブジェクトの状態と同期するために必要なSQLステートメントを実行します。

あなたの場合:トランザクションがロールバックの場合、これらの変更はすべて元に戻されますが、それでもセッションはDBに同期されません。

したがって、Session.Flush()がこれを行います。

http://nhibernate.info/doc/nh/en/index.html#manipulatingdata-endingsession

于 2012-12-02T05:31:14.553 に答える