我很难理解如何决定用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注释,为什么?
发布于 2013-10-24 04:34:28
通用答案
查找定义实际事务的操作--在本例中,是transfer方法。此方法本身表示一个完整的事务,因此您应该对其进行标记。
@Transactional(propagation = REQUIRED)您需要保护其他方法不被错误地从事务中调用,所以注释它们是一个好主意。
@Transactional(propagation = MANDATORY)以确保它们只从某些正在运行的事务的上下文中调用。
Spring-特定的答案
默认情况下,Spring使用代理对象来实现诸如事务之类的通知,并且没有应用自调用(在this上隐式或显式地调用不通过代理对象的方法)。这意味着Spring实际上不会在本例中对deduct和deposit方法强制执行建议,尽管它仍然可以保护它们不被其他事务调用到事务之外。AspectJ AOP模型需要额外的编译时步骤,但避免了自调用问题,并正确地将通知应用于所有方法调用。
发布于 2013-10-24 04:34:01
修改2+属性的每一个方法都应该是@Transactional。我正准备给你举个例子,即使你没有转账法。
https://stackoverflow.com/questions/19556933
复制相似问题