我有一个关于@Transactional注释如何单独管理代码和事务执行的问题。给定一个正确设置的Spring应用程序和以下代码:
@Transactional
public void withdraw(int amount) {
if(isEnoughFunds(amount)) {
decreaseFunds(amount);
}
}
是否可能发生以下情况:
如果有可能,你会如何防止这种情况?
答案 0 :(得分:3)
是的,取决于隔离级别,这是可能的。为了防止它,您可以在调用ifEnoughFunds()之前显式地从数据库获取读锁定。锁将在交易结束时释放。在这种情况下,线程B将始终在检查之前等待线程的A事务提交。