首页 > 解决方案 > Hibernate PESSIMISTIC_WRITE 不锁定数据库并返回 oldValue

问题描述

我正在使用“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

@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 不起作用以及解决此问题的解决方法是什么?

标签: springpostgresqlhibernatepersistencepessimistic-locking

解决方案


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


推荐阅读