java - 用于读取的 JPA 锁定实体

标签 java jpa transactions

我有代码:

public static Computation findByDateAndPaymentSystem(EntityManager em, Calendar date, PaymentSystem paymentSystem) throws SCException {
        Query query = em.createNamedQuery("Computation.findByDateAndPaymentSystem");
        query.setParameter("date", date);
        query.setParameter("ps", paymentSystem);
        List<Computation> computationList = query.getResultList();
        if (computationList != null && computationList.size() > 0) {
            if (computationList.size() == 1) {
                return computationList.get(0);
            } else {
                throw new SCException("Not unique result in computation for date '"
                        + new SimpleDateFormat("dd.MM.yyyy").format(new Date(date.getTimeInMillis())) + "' and paymentSystem = '"
                        + paymentSystem.getShortName() + "'");
            }
        } else {
            Computation computation = new Computation();
            computation.setDate(date);
            computation.setComputationState(ComputationState.CREATED);
            computation.setPaymentSystem(paymentSystem);
            em.persist(computation);
            return computation;
        }
    }

主要想法是我应该为每个日期和支付系统分配一个计算实例。 但如果在两个不同的事务中调用此方法,则可能出现以下情况: 第一个事务检查,如果该日期没有计算并创建计算但仍未提交创建的计算,另一个事务检查并也创建计算,则两个事务都提交。因此,每个日期都会进行两次计算。

如何预防?

最佳答案

Computation.datePaymentSystem 组合应该是唯一的(约束),然后第二次插入将失败,或者如果找到多个条目,您可以尝试合并多个条目。解决方案取决于您的用例以及事务策略和设置。

关于java - 用于读取的 JPA 锁定实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8094402/

相关文章:

php - 如果使用 MySQL 事务,我必须考虑哪些差异?

PHP PayPal Sandbox在交易后无法获得值(value)

java - java中字符列表中的字符搜索方法

java - 使用 Parse 从应用程序引擎发送推送通知

java - 使用什么级联类型来仅保存多对多映射的子级列表?

java - 已弃用 : Hibernate setHint

hibernate - JPA Hibernate 合并执行插入而不是更新

java - 由 NullPointerException 引起的一般错误 [50000-175]

java - 从父级 JPA 获取所有子级和子级

php - MySQL 提交和事务