spring - 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 不起作用以及解决此问题的解决方法是什么?
解决方案
获得锁后,如果我做了 session.refresh(entity),我得到了更新的值。
推荐阅读
- python - 查找数字的前后值 - Python
- go - 在 localhost 中使用 Go 和 Postfix 发送邮件
- java - 无法获得隔离的 JDBC 连接:org.hibernate.exception.JDBCConnectionException
- reactjs - 学习 React Native,问函数 vs 类
- mysql - 无法将任何 Arduino 连接到本地数据库服务器,我已经尝试了我能想到的一切
- android - 将相机照片保存为 PDF
- amazon-neptune - 尝试连接到启用 IAM 的 AWS Neptune 时出现 400 错误请求
- javascript - 如何从 React Native 中的 InputBox 中删除建议框
- solr - 来自父实体的 Solr 变量未在子实体中设置
- android - 我无法从 sharedpreferences 中删除项目