有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java何时使用JPA锁定?

我正在使用JPA开发一个简单的Spring Boot CRUD应用程序,用于管理数据库中的产品。在我的测试中,该应用程序的行为与预期一致,可以创建、读取、更新和删除产品。现在我正在考虑这个应用程序在并发环境中的性能

阅读https://www.baeldung.com/jpa-optimistic-locking,其中描述了“以有效且最重要的防错方式处理多个事务”但这不是由Spring Boot框架处理的吗?我以前遇到过CRUD应用程序,从未遇到过显式实现锁定的情况。我假设任何数据库更新都是线程安全的,不需要显式地实现锁定,但这不总是正确的吗

我应该使用锁定来计算例如产品库存吗?因此,如果我有3个产品和3个GET请求分别被调用来读取1、2和3个产品,那么其中一个线程将访问数据库没有更新的产品的风险是,由于其他线程耗尽了资源,没有足够的时间来指示产品不再可用


共 (1) 个答案

  1. # 1 楼答案

    乐观锁定有助于防止更改包含实体旧信息的内容

    想象一下下面的场景:

    你有一个产品实体,这个产品有一个购买和销售价格

    假设一个线程从数据库中加载Enity,购买价格为10美元,销售价格为12美元

    代码将售价调整为15美元,但在将此更改提交到数据库之前,另一个线程也在修改实体

    另一个线程调整了购买价格,并将其提高到20美元,这个更改已经提交到数据库中

    我很确定,如果购买价格是20美元,你不想把售价定为15美元

    通过乐观锁定,框架(即Hibrate)检查应保存的实体是否与从数据库加载时处于相同的状态。否则它将抛出乐观锁定异常。 如果购买价格仍然是10美元,将售价改为15美元就可以了。但是,如果同时购买价格发生了某种变化,乐观锁定可以帮助您在过时的信息上不设置新的销售价格(在这种情况下,购买价格是10美元)