multithreading - 两个并发请求,相同的 JPA 实体 - 有问题吗?

标签 multithreading hibernate jpa thread-safety

假设我的网络服务器同时收到两个请求。

它将在单独的线程中处理每个请求。

它将为每个线程创建一个 JPA 实体管理器。

现在假设每个线程请求相同的数据库行。假设我有一张名为 Cars 的表。我有一辆 id = 5 的汽车。我在两个线程中都查找了一辆 id = 5 的汽车。

所以我现在有两个单独的对象代表同一个实体。

现在假设我在线程 1 中更新汽车的 gasLevel。如果我在线程 2 中获得 gasLevel,我会获得线程 1 设置的新 gasLevel 吗?

最佳答案

不,你不会,因为正如你所说,你有两个不同的实体实例。如果他们都将 gasLevel 更新为不同的值,则最后一次提交将获胜。

这是实现乐观锁定的原因之一,使用带有@Version 注释的版本字段:最后一次提交将失败,因为其他一些事务在实体加载到刷新其新状态之间更新了值。

请注意,即使线程 1 读取值 (7),将其更改为 8,刷新,然后线程 2 读取该值,线程 2 在默认情况下仍然会看到 7,因为默认情况是使用 READ_COMMITTED 隔离级别。这意味着一个事务只能看到其他事务提交的数据。不过,这取决于数据库。例如 HSQLDB 仅支持 READ_UNCOMMITTED。

关于multithreading - 两个并发请求,相同的 JPA 实体 - 有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8190287/

相关文章:

java - 将任务添加到执行器

java - Spring JPA Repository 上的 API 数量是否会影响启动时间?

java - 引文 : which solution I should use for tests with JPA?

jpa - 如何动态修改@PersistenceContext 中的unitName

java - 扩展 hibernate 实体以添加非拥有关系,针对同一个表

multithreading - 编排 Windows Azure Web 角色以应对偶尔的高工作负载

c++ - 如何编译openCV保证单线程?

linux - 对于多线程程序,如果一个线程死了你怎么知道?

java - 使用 Spring Data Jpa 中的 CrudRepository 时如何修复 NoSuchBeanDefinitionException?

java - Hibernate:具有相同标识符值的不同对象已经与 session 相关联