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

Ale*_*dre 1 multithreading hibernate jpa thread-safety

假设我的Web服务器同时收到两个请求.

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

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

现在让我们说每个线程请求相同的数据库行.说我有一张名为Cars的桌子.我有一辆id为5的汽车.我在两个螺纹中找到一辆id = 5的汽车.

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

现在让我说我在线程1中更新汽车的gasLevel.如果我在线程2中得到gasLevel,我是否会获得由线程1设置的新gasLevel?

JB *_*zet 6

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

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

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