Я использую базу данных "Postgres" и pessimistic_locking для блокировки строки базы данных.
У меня есть следующий код
@Transactional
doProcess(int id, int quantity){
Article article = lockArticle(id);
modifyArticle(article, quantity);
}
Это функция lockArticle (), которая блокирует и выбирает статью из БД (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);
}
Скажем, вначале в дБ, статья имеет количество 10.
Я породил 2 потока для обновления количества товара, первый поток порожден с количеством = 2, второй поток с 3. Так что в идеале DB после обеих обработок должен быть 5 (10-2-3).
Но для базы данных net количество в дБ равно либо 8 (10-2) / 7 (10-3).
Может кто-нибудь помочь мне понять, почему PESSIMISTIC_LOCKING не работает и что можно обойти, чтобы это исправить?