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

发布于 2024-12-17 07:28:34 字数 264 浏览 0 评论 0原文

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

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

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

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

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

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

Say my web server receives two simultaneous requests.

It will handle each request in a separate thread.

It will create a JPA entity manager for each thread.

Now let's say each thread requests the same database row. Say I have a table called Cars. I have a car with id = 5. I do a find for a car with id = 5 in both threads.

So I now have two separate objects representing the same entity.

Now let's say I update the gasLevel of the car in thread 1. If I get the gasLevel in thread 2, will I get the new gasLevel set by thread 1?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

被翻牌 2024-12-24 07:28:34

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

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

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

No, you won't, because as you said, you have two different instances of the entity. If they both update the gasLevel to a different value, then the last commit will win.

That's one of the reasons to implement optimistic locking, using a version field annotated with @Version: the last commit will fail because some other transaction has updated the value between the moment the entity was loaded and the moment its new state is flushed.

Note that even if thread 1 reads the value (7), changes it to 8, flushes, and thread2 then reads the value, thread 2 will still see 7 in the default case, because the default case is to use the READ_COMMITTED isolation level. This means that one transaction only sees the data that has been committed by other transactions. This depends on the database, though. HSQLDB for example only supports READ_UNCOMMITTED.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文