我在Spring和JPA/Hibernate中玩弄了一下,我對在表中增加計數器的方式感到困惑。Spring,JPA和Hibernate - 如何增加沒有併發問題的計數器
我的REST API需要增加,並根據用戶動作(在本例中波紋管,喜歡或不喜歡標籤將在標籤表使計數器遞增或遞減一個)
數據庫遞減某個值tagRepository是JpaRepository(Spring的數據) 和我有這樣
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"/>
@Controller
public class TestController {
@Autowired
TagService tagService
public void increaseTag() {
tagService.increaseTagcount();
}
public void decreaseTag() {
tagService.decreaseTagcount();
}
}
@Transactional
@Service
public class TagServiceImpl implements TagService {
pubic void decreaseTagcount() {
Tag tag = tagRepository.findOne(tagId);
decrement(tag)
}
pubic void increaseTagcount() {
Tag tag = tagRepository.findOne(tagId);
increment(tag)
}
private void increment(Tag tag) {
tag.setCount(tag.getCount() + 1);
Thread.sleep(20000);
tagRepository.save(tag);
}
private void decrement(Tag tag) {
tag.setCount(tag.getCount() - 1);
tagRepository.save(tag);
}
}
配置的交易正如你可以看到我已經穿上目的的增量20秒的睡眠.save前JUST()來能夠測試併發場景。
初始標籤計數器= 10;
1)用戶呼叫increaseTag和代碼擊中睡眠所以實體= 11和在DB中值的值 仍爲10
2)用戶呼叫decreaseTag並通過去所有的代碼。所述 值是數據庫現在= 9
3)休眠結束並且擊中用具有11 計數該實體的.save然後點擊.save()
當我檢查數據庫中,該標記的值現在等於11 ..實際上(至少是我想實現的)它將等於10
此行爲是否正常?或者@Transactional註解沒有做的是工作?
天才..這是處理悲觀主義者鎖定的100倍! – Johny19
(順便提一下,我發佈了一些關於隔離級別的文檔,然後我剛剛意識到這是你的博客),它非常清楚並且很好地解釋了。所以+1也是如此! – Johny19
感謝您欣賞我的作品。 –