首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate PESSIMISTIC_WRITE不锁定db并返回oldValue

Hibernate PESSIMISTIC_WRITE不锁定db并返回oldValue
EN

Stack Overflow用户
提问于 2020-02-09 03:03:25
回答 1查看 261关注 0票数 0

我使用"Postgres“数据库和pessimistic_locking锁定数据库行。

我有以下代码

代码语言:javascript
复制
@Transactional
doProcess(int id, int quantity){
   Article article = lockArticle(id);
   modifyArticle(article, quantity);
}

这是lockArticle()函数,它从DB(Postgres)锁定和获取文章

代码语言:javascript
复制
Article lockArticle(int id){
        return sessionFactory.getCurrentSession().createCriteria(Article.class)
                .add(Restrictions.eq("id", id))
                .setLockMode(LockMode.PESSIMISTIC_WRITE)
                .setTimeout(10000)
                .getUniqueResult();
    }

下面是modifyArticle(),它基本上删除/更新数据库中的文章条目。

代码语言:javascript
复制
modifyArticle(Article article, int quantity){

 if(article.getQuantity()<quantity){
     dao.delete(article);
 }

 else{
   article.setQuantity(article.getQuantity()-quantity)
   dao.updateArticle(article);
  }
}

//DAO用于updateArticle

代码语言:javascript
复制
@Transactional
updateArticle(Article article){
   sessionFactory.getCurrentSession().saveOrUpdate(article);
}

假设最初在db中,文章有数量10。

我已经生成了两个线程来更新文章数量,第一个线程是以quantity = 2生成的,第二个线程是用3个线程生成的。所以理想情况下,完成这两个处理后的DB应该是5(10-2-3)。

但db中的数据库净数量不是8(10-2)/7(10-3)。

有人能帮我理解一下为什么PESSIMISTIC_LOCKING不起作用吗?有什么办法可以解决这个问题呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-26 09:06:36

获得锁后,如果执行session.refresh(实体),则得到更新的值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60133105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档