2017-04-18 159 views
0

虽然这个问题看起来很基本,但是我的场景与其他帖子@stackoverflow完全不同。我使用JPA &运动衫(REST)实现弹簧。每当我打2个请求同时从卷曲到我的Java REST方法以更新数据库资源,首先请求被成功执行,但第二个请求被失败,乐观锁定异常:如何让线程等到另一个线程完成该方法执行

javax.persistence.OptimisticLockException:异常 [ EclipseLink-5006](Eclipse持久性服务 - 2.5.2.v20140319-9ad6abd):org.eclipse.persistence.exceptions.OptimisticLockException异常 说明:该对象无法更新,因为它已更改,或者自上次读取以来已删除 。

我已经尝试把更新后的代码放在同步块中,但它没有奏效。

我也试过声明rest方法是同步的,但没有工作。

现在我想让我的方法被第一个请求执行,并希望第二个请求等到第一个请求完成它的执行。

我已经实现了这个使用static变量,但不想使用static由于代码标准的变量。

有人可以给这个有效的解决方案吗?

+1

使用synchronized执行同步块内的数据库操作应该工作,只要你同步上同一个实例。提供有关您用作锁的更多细节以及您如何使用它。 – erickson

+0

什么持久性告诉你,你的第二次更新有第一次更新的比赛(根据你的问题,这是真的)。因此,无论哪个更新第二次到达内部持久化的同步块,都没有看到第一个更新,并且因为它们两个的更新实体是相同的,所以第二次更新被拒绝,因为它的数据是“过时的”。在这种情况下,理想情况下应该执行的操作是清除陈旧请求,并使用更新的实体重新启动它,然后再次尝试更新。 –

+0

你有映射类中有相应表列的'@ Version'字段吗? – eg04lt3r

回答

0

在数据库调用之前使用同步将有所帮助。使用synchronized关键字

synchronized(this){ 
//process 
} 

2)另一种选择

1)为前方法名

synchronized void <method(){ 
//process 
} 
相关问题