Java 在一个新事务中更新,然后在另一个事务中查找返回旧数据。为什么?

Java 在一个新事务中更新,然后在另一个事务中查找返回旧数据。为什么?,java,orm,jpa,jakarta-ee,second-level-cache,Java,Orm,Jpa,Jakarta Ee,Second Level Cache,我认为这个问题最好用一幅图片来描述。我希望有人能帮助我。谢谢 我不确定您是否给出了所有上下文,但如果(1)和(2)在同一事务中运行,我会说该实体在一级缓存中,这就是问题所暗示的,并且在“更新行”中所做的更改不可见,因为它们是在另一个持久性上下文(嵌套事务)中完成的,因此需要从数据库中获取实例的状态。我同意Pascal的观点,如果来自EJB1的两个调用在同一事务中,那么很明显,(2)无法看到(1)执行的更改,因为它们是在另一个事务中执行的(当然,假设有一个合理的事务隔离级别) 你确定这个问题是关于

我认为这个问题最好用一幅图片来描述。我希望有人能帮助我。谢谢

我不确定您是否给出了所有上下文,但如果(1)和(2)在同一事务中运行,我会说该实体在一级缓存中,这就是问题所暗示的,并且在“更新行”中所做的更改不可见,因为它们是在另一个持久性上下文(嵌套事务)中完成的,因此需要从数据库中获取实例的状态。

我同意Pascal的观点,如果来自EJB1的两个调用在同一事务中,那么很明显,(2)无法看到(1)执行的更改,因为它们是在另一个事务中执行的(当然,假设有一个合理的事务隔离级别)


你确定这个问题是关于二级缓存的吗?我个人不这么认为。你真的提供了所有的细节吗?(1)和(2)是在EJB1的一个方法中执行的吗?是的,1和2是在一个方法中执行的,所以你的理论是它是返回旧对象的一级缓存?@tieTYT是的,我很确定它不仅仅是一个理论:)(顺便说一句,这个问题似乎与提供程序无关,JPA1.0中没有二级缓存)。
1. EJB1 transaction (TX1) starts
2.  EJB1.(1) called
3.   EJB2.update row started => TX1 is suspended and
     a new transaction, TX2, is started
4.   The update is performed
5.   TX2 commits
6.  TX1 is resumed - it can't see changes by TX2 because it's isolated from
    changes performed by other transactions during its "life"
7.  EJB1.(2) invokes EJB2.find row withing the context of TX1 => can't see TX2's changes
8. TX1 commits