0

我有一些交易代码:

import org.hibernate.Session;
void PersistRemovePersist(){ 
try {

    UserTransaction ut = getUt();
    EntityManagerFactory emf = getEmf();
    A = new some.Entity("A");

    ut.begin();
    EntityManager em = emf.createEntityManager();
    Session ss = em.unwrap(Session.class);
    saveOrUpdate(A);
    ut.commit();
    em.close();

    ut.begin(); //TX1
    EntityManager em = emf.createEntityManager();
    Person a = em.find(Person.class,db.A.getId());
    em.remove(a);
    ut.commit();
    em.close();

    ut.begin(); //TX2
    em = emf.createEntityManager();
    em.unwrap(Session.class).saveOrUpdate(A);
    ut.commit(); // <- wrapped StaleObjectStateException
    em.close();
    }catch (Exception e){
        throw new RuntimeException(e);
    }
}

在代码执行时,我得到一个异常:

org.hibernate.StaleObjectStateException:行已被另一个事务更新或删除(或未保存的值映射不正确):[some.Entity#1]

但为什么?TX1 和 TX2 是串行的,而不是并行的。我错过了什么?

4

1 回答 1

0

saveOrUpdate()如果有生成的 ID 为空则插入,如果生成的 ID 不为空则更新。

在您的情况下,在 TX2 中,它不为空(因为它是在 TX0 中生成的)。所以它试图更新。但是您删除了 TX1 中的实体。因此例外:

行已被另一个事务更新或删除

这正是您所做的:您在另一个事务中删除了该行。

于 2019-09-08T14:47:30.993 回答