假设我的网络服务器同时收到两个请求。
它将在一个单独的线程中处理每个请求。
它将为每个线程创建一个JPA实体管理器。
现在假设每个线程请求相同的数据库行。说我有一张名为Cars的桌子。我有一辆id为5的汽车。我在两个螺纹中找到一辆id = 5的汽车。
所以我现在有两个独立的对象代表同一个实体。
现在让我说我在线程1中更新汽车的gasLevel。如果我在线程2中获得gasLevel,我是否会获得由线程1设置的新gasLevel?
答案 0 :(得分:6)
不,你不会,因为正如你所说,你有两个不同的实体实例。如果他们都将gasLevel更新为不同的值,那么最后一次提交将获胜。
使用@Version注释的版本字段实现乐观锁定的原因之一:最后一次提交将失败,因为某个其他事务已在加载实体的时刻和其实例之间更新了值新州被冲洗了。
请注意,即使线程1读取值(7),将其更改为8,刷新,然后thread2读取该值,线程2仍将在默认情况下看到7,因为默认情况下使用READ_COMMITTED隔离级别。这意味着一个事务只能看到其他事务提交的数据。但这取决于数据库。例如,HSQLDB仅支持READ_UNCOMMITTED。