JPA实体延迟加载功能是否会导致不可重复的读取?

时间:2013-02-22 19:35:12

标签: jpa locking lazy-loading consistency

JPA实体延迟加载功能是否会导致不可重复的读取现象?是否会导致给定实体与延迟加载的相关实体(例如@OneToMany)之间的不一致?

让我用一个(相当卷积的)例子说明问题。拿两个JPA实体, 部门(1)< - > (N)员工。我们想要计算公司的工资总额:

@Stateless
public class EmployeeManagerImpl implements EmployeeManager {

  public long calculateDepartmentTotals() {
    long total = 0;

    for (Department dept : findAllDepartments()) {  // SELECT all departments
      for (Employee emp : dept.getEmployees()) {    // Lazy-loading of employees
        total += emp.getSalary();
      }
    }
    return total;
  }
}

首先,我们从数据库中选择所有部门(在t0)。然后,我们迭代这个集合,并在t1,t2,t3 ...... tn时间点懒洋洋地为每个部门getEmployees()。现在,如果某个其他事务在t0和tn之间将员工从一个部门移动到另一个部门,那么员工薪水可以总计两次(或者没有)。所以我猜工资总额可能会被错误地计算出来。

另外,如果我们在网页中显示每个部门的员工列表,那么我们也会将该员工列出两次(或者没有)。

我的猜测是否正确?

PS:当然,上述问题可以通过使用LEFT JOIN FETCH或在乐观读取模式下锁定员工来解决,但我想知道延迟加载(如果有的话)可能出现的潜在一致性问题。我在互联网上搜索并没有找到任何参考。

0 个答案:

没有答案