2016-12-14 71 views
1

我的问题。 我有一个简单的表,令牌。它只有几个属性。 id,令牌,用户名,版本和expire_date。 我有一个将创建或更新令牌的休息服务。因此,当用户请求令牌时,我想检查用户(使用用户名)是否已经有条目,如果是,则只需更新expire_date并返回,如果没有条目创建新条目。问题是,如果我创建了一个测试用几个并发用户(使用Jmeter脚本),这称为休息服务,休眠将非常快地抛出一个StaleObject异常,因为会发生什么是:线程A将为用户选择行,改变expire_date,碰撞版本,同时线程B会做同样的事情,但实际上会在线程A提交之前提交。现在当线程A将提交hibernate检测到版本更改并将抛出异常和回滚。所有作品都按文件记录如何使用休眠创建线程安全插入或更新(处理乐观锁定)

但我想要发生的是,线程B将等待线程A完成之前完成它的事情。

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

感谢

回答

0

如果您正在使用JEE服务器,EJB容器会做它,你使用@Singleton的。

0

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