java Spring@Transaction
我很难理解如何决定用Spring@Transaction注释哪些方法
BankService {
transfer(Account from, Account to, int amount){
deduct(from, amount);
deposit(to, amount);
}
deduct(Account account, int amount){
account = accountRepo.load(account); //make sure we dont have an old reference with old balance
int balance = account.getBalance();
if (balance<amount){
throw new IllegalStateException("Not enough money");
} else {
account.setBalance(balance-amount);
accountRepo.save(account);
}
}
deposit(Account account, int amount){
account = accountRepo.load(account); //make sure we dont have an old reference with old balance
account.setBalance(account.getBalance() + amount);
accountRepo.save(account);
}
}
在转账过程中,如果扣除失败,即使存款没有失败,存款显然也不应该继续
在五种方法(转账、扣减、存款、加载、保存)中,哪些方法应该用@Transactional注释,为什么
# 1 楼答案
一般答案
在本例中,查找定义实际事务的操作,即
transfer
方法。此方法本身代表一个完整的事务,因此您应该标记它您需要保护其他方法不被错误地从事务中调用,因此最好对它们进行注释
以确保它们仅从某个正在运行的事务的上下文中调用
特定于春季的答案
默认情况下,Spring使用代理对象来实现事务之类的建议,自调用(在
this
上隐式或显式调用的方法,不经过代理对象)不应用建议。这意味着Spring实际上不会在本例中对deduct
和deposit
方法执行建议,尽管它仍然可以保护它们不被其他对象在事务外部调用。AspectJ AOP模型需要额外的编译时步骤,但避免了自调用问题,并正确地将建议应用于所有方法调用# 2 楼答案
每个修改2+属性的方法都应该是@Transactional。我正要给你举个例子,转移资金的方法,即使你没有