代码之家  ›  专栏  ›  技术社区  ›  Manish

数据库更新中乐观锁定的实现

  •  0
  • Manish  · 技术社区  · 2 年前

    我的应用程序中有一个要求,在更新数据库中的记录之前,我想确保该记录不会被其他用户更新。我知道如何通过在实体中具有版本标识符来实现乐观锁定,这将解决它。

    @Transactional
    public void updateProductApprover(Long productId, String currentLoggedInUser) {
        Product product = productRepository.findById(productId)
                .orElseThrow(() -> new EntityNotFoundException("Product not found"));
        // if updation done by another user, then save will automatically throw exception
     
        product.setApprovedBy(currentLoggedInUser);
        productRepository.save(product);
    }
    

    所以在上面的场景中,在获取产品后,如果数据库中的产品数据发生任何更新,保存将失败 OptimisticLockException 这很好。

    如果在我的屏幕上打开查看产品UI页面,我花了2-3分钟的时间发送更新请求,同时另一个用户更新了一些内容,该怎么办。它将如何工作?

    我的假设是,在加载视图产品页面时,我还必须加载标识符,并将其发送到更新请求中。在后端,我必须将其与数据库行版本相匹配。如果不匹配,我会要求用户刷新产品页面并再次发送更新请求。

    因此,它将主要包括:

    1. 我的应用程序通过从UI页面发送更新请求中的版本来明确实现,并根据数据库进行验证,因为请求只会发送id进行更新,在更新之前不可能隐式检查版本。
    2. 当我的更新发生在updateProductPrice开始执行和从数据库获取产品之后时,JPA隐含地实现了这一点。

    如果我遗漏了什么,请提出建议。

    当做

    0 回复  |  直到 2 年前