Multithreading 冬眠。在主线程中创建的实体是';孩子一看不见

Multithreading 冬眠。在主线程中创建的实体是';孩子一看不见,multithreading,hibernate,transactions,Multithreading,Hibernate,Transactions,我发现了奇怪的冬眠行为,我无法解释 如果我在事务内部的默认线程中创建一个对象并进行手动刷新 那么我在其他线程中找不到它 如果我在一个特殊线程中以相同的条件创建一个对象,那么一切都正常 下面是我在上面描述的代码: // transaction template with propagation required ttNew.execute(new TransactionCallbackWithoutResult() { @Override

我发现了奇怪的冬眠行为,我无法解释

如果我在事务内部的默认线程中创建一个对象并进行手动刷新 那么我在其他线程中找不到它

如果我在一个特殊线程中以相同的条件创建一个对象,那么一切都正常

下面是我在上面描述的代码:

// 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。

因为您无法在另一个事务中看到未提交的数据。这里有两个不同的事务,因此一个事务不能看到另一个事务的未提交数据。
默认的孤立主义者是读提交的。刷新并不意味着提交。提交将仅在事务结束时完成。因此,当您刷新第一个事务中的数据时,数据会写入数据库,但不会提交,因此事务2无法看到它。

在线程终止触发某些触发器之前,刷新方法似乎不起作用。会话绑定到线程。我想我发现了差异,但不是根本原因。如果将两个原始块包裹在另一个线程中,它将再次工作。JUnit的问题。它的线程是特殊的,但为什么?为什么你认为我的事务是未限制的。我有两个事务,它们是按顺序执行的。我刷新结果。我做错了什么?我应该添加什么命令?编辑我的答案,看看编辑后的答案是否满足。