奇妙な休止状態の動作を見つけましたが、説明できません。
トランザクション内のデフォルト スレッドでオブジェクトを作成し、手動でフラッシュすると、他のスレッドでそれを見つけることができません。
同じ条件で 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 を使用します。