首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring @事务

Spring @事务
EN

Stack Overflow用户
提问于 2013-10-24 04:28:30
回答 2查看 4.4K关注 0票数 0

我很难理解如何决定用Spring @Transaction注释哪些方法。

代码语言:javascript
复制
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注释,为什么?

EN

回答 2

Stack Overflow用户

发布于 2013-10-24 04:34:28

通用答案

查找定义实际事务的操作--在本例中,是transfer方法。此方法本身表示一个完整的事务,因此您应该对其进行标记。

代码语言:javascript
复制
@Transactional(propagation = REQUIRED)

您需要保护其他方法不被错误地从事务中调用,所以注释它们是一个好主意。

代码语言:javascript
复制
@Transactional(propagation = MANDATORY)

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

Spring-特定的答案

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

票数 4
EN

Stack Overflow用户

发布于 2013-10-24 04:34:01

修改2+属性的每一个方法都应该是@Transactional。我正准备给你举个例子,即使你没有转账法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19556933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档