0

奇妙な休止状態の動作を見つけましたが、説明できません。

トランザクション内のデフォルト スレッドでオブジェクトを作成し、手動でフラッシュすると、他のスレッドでそれを見つけることができません。

同じ条件で 1 つの特別なスレッドでオブジェクトを作成すると、すべて問題ありません。

上記で説明したコードは次のとおりです。

// transaction template with propagation required 
            ttNew.execute(new TransactionCallbackWithoutResult() {
                @Override
                protected void doInTransactionWithoutResult(TransactionStatus status) {
                    Assert.assertEquals(envStDao.getAll().size(), 0);
                    g = new Group();
                    g.setDescription("trial");
                       // in debugger I get id = 1
                    groupDao.save(g);

                    groupDao.flush();
                    accDao.flush();


                 }
                });

    // second stage right after the first - searching the group

   Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
        ttNew.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus status) {
            // here I get NULL!
            Group gg = groupDao.get(1);
        }
    });
        }
    });
    t2.start();
    t2.join();

コードの最初のブロックをスレッドにラップすると、以前と同じようにグループが取得されます。

何かアイデアはありますか?

上記のコードをjunitテストで実行します。Dao オブジェクトは HibernateTemplate を使用します。

4

1 に答える 1

0

トランザクションの分離により、別のトランザクションでコミットされていないデータを表示することはできません。ここには2つの異なるトランザクションがあるため、一方が他方のコミットされていないデータを表示することはできません。デフォルトの分離主義者は読み取りコミットされています。フラッシュはコミットを意味しません。コミットは、トランザクションの最後にのみ実行されます。したがって、最初のトランザクションでデータをフラッシュすると、データはデータベースに書き込まれますが、コミットされないため、トランザクション2はそれを認識できません。

于 2012-08-04T07:50:20.180 に答える