Hibernate PESSIMISTIC_WRITE未锁定db并返回oldValue

问题描述 投票:0回答:1

我正在使用“ Postgres”数据库和pessimistic_locking锁定数据库行。

我有以下代码

@Transactional
doProcess(int id, int quantity){
   Article article = lockArticle(id);
   modifyArticle(article, quantity);
}

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

Article lockArticle(int id){
        return sessionFactory.getCurrentSession().createCriteria(Article.class)
                .add(Restrictions.eq("id", id))
                .setLockMode(LockMode.PESSIMISTIC_WRITE)
                .setTimeout(10000)
                .getUniqueResult();
    }

这里是ModifyArticle(),它基本上删除/更新数据库中的文章条目。

modifyArticle(Article article, int quantity){

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

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

// DAO for updateArticle

@Transactional
updateArticle(Article article){
   sessionFactory.getCurrentSession().saveOrUpdate(article);
}

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

[我生成了2个线程来更新商品数量,生成的第一个线程数量为2,第二个线程的数量为3。因此,理想的情况是,两次完成处理后的DB应该为5(10-2-3)。

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

有人可以帮我理解为什么PESSIMISTIC_LOCKING无法正常工作,解决此问题的解决方法是什么?

spring postgresql hibernate persistence pessimistic-locking
1个回答
0
投票

获得锁后,如果我进行了session.refresh(entity),则获得了更新的值。

© www.soinside.com 2019 - 2024. All rights reserved.