如何使用hibernate创建线程安全插入或更新。(处理乐观锁定)

时间:2016-12-14 08:46:19

标签: spring hibernate jpa concurrency thread-safety

我的问题。 我有一个简单的表,令牌。它只有一些属性。 id,token,username,version和expire_date。 我有一个休息服务,将创建或更新令牌。因此,当用户请求令牌时,我想检查用户(使用用户名)是否已有条目,如果是,则只需更新expire_date并返回,如果没有条目创建新条目。问题是如果我用几个并发用户创建一个测试(使用jmeter脚本),那就调用其余的服务,hibernate会非常快 抛出StaleObject异常,因为发生的事情是:线程A将为用户选择行,更改expire_date,使版本崩溃,同时线程B将执行相同操作但实际上将在线程A提交之前设置提交。现在当线程A将提交时,hibernate检测到版本更改并将抛出异常并回滚。所有工作都记录在案。

但是我想要发生的是,线程B将等待线程A完成之后才能完成它。

解决此问题的最佳方法是什么?我应该使用java并发包并实现锁吗?或者它是实现自定义jpa隔离级别的更好选择吗?

由于

2 个答案:

答案 0 :(得分:0)

如果您正在使用JEE服务器,那么EJB容器将使用@Singleton为您执行此操作。

答案 1 :(得分:0)

我认为最好的方法是使用JPA锁来锁定当前正在更新的资源(行锁定)。不要努力使用自己的java并发来实现行锁定。例如:在dbms级别中锁定行包含用户“john.doe”会更容易,而不是在代码中找到使用并发性锁定特定行的方法。