我使用"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用于updateArticle
@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不起作用吗?有什么办法可以解决这个问题呢?
发布于 2020-02-26 09:06:36
获得锁后,如果执行session.refresh(实体),则得到更新的值。
https://stackoverflow.com/questions/60133105
复制相似问题