【发布时间】:2012-09-26 14:51:08
【问题描述】:
我有一个关于 @Transactional 注释如何单独管理代码和事务执行的问题。给定正确设置的 Spring 应用程序和以下代码:
@Transactional
public void withdraw(int amount) {
if(isEnoughFunds(amount)) {
decreaseFunds(amount);
}
}
会不会出现以下情况:
- 资金 == 100;金额 == 100
- 线程 A 进入提现/事务 A 开始
- 线程 A 执行 isEnoughFunds,结果为真
- 线程 B 进入提现/事务 B 开始
- 线程 B 执行 isEnoughFunds,结果为真
- 线程 A 执行 reductionFunds / 线程 A 锁定 db 记录
- 线程 B 等待线程 A 提交事务并释放写锁
- 线程 A 退出撤销/事务 A 提交
- 线程 B 执行 reductionFunds / 线程 B 锁定数据库记录
- 线程 B 退出退出/事务 B 提交
- 资金 == -100
如果可能的话,你会如何防止这种情况发生?
【问题讨论】:
-
注释只是说将其包装在事务中。数据库隔离级别决定了发生多少交错。
标签: java spring isolation-level transaction-isolation