有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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注释,为什么


共 (2) 个答案

  1. # 1 楼答案

    一般答案

    在本例中,查找定义实际事务的操作,即transfer方法。此方法本身代表一个完整的事务,因此您应该标记它

    @Transactional(propagation = REQUIRED)
    

    您需要保护其他方法不被错误地从事务中调用,因此最好对它们进行注释

    @Transactional(propagation = MANDATORY)
    

    以确保它们仅从某个正在运行的事务的上下文中调用

    特定于春季的答案

    默认情况下,Spring使用代理对象来实现事务之类的建议,自调用(在this上隐式或显式调用的方法,不经过代理对象)不应用建议。这意味着Spring实际上不会在本例中对deductdeposit方法执行建议,尽管它仍然可以保护它们不被其他对象在事务外部调用。AspectJ AOP模型需要额外的编译时步骤,但避免了自调用问题,并正确地将建议应用于所有方法调用

  2. # 2 楼答案

    每个修改2+属性的方法都应该是@Transactional。我正要给你举个例子,转移资金的方法,即使你没有