当前位置: 首页 > 知识库问答 >
问题:

Spring@Transaction

西门鹏程
2023-03-14

我很难理解如何决定使用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个答案

阮华美
2023-03-14

一般回答

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

@Transactional(propagation = REQUIRED)

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

@Transactional(propagation = MANDATORY)

Spring专用答案

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

 类似资料:
  • Spring是一个流行的Web框架,可以轻松集成许多常见的Web任务。 所以问题是,当我们拥有Struts2时,为什么我们需要Spring呢? 好吧,Spring不仅仅是一个MVC框架 - 它提供了很多Struts中没有的其他好东西。 例如:依赖注入可以对任何框架有用。 在本章中,我们将通过一个简单的示例来了解如何将Spring和Struts2集成在一起。 首先,您需要将以下文件添加到Spring

  • 我正在尝试让Spring事务管理在我的新Spring Boot MyBatis应用程序中工作。 到目前为止,我已经设法让一切都以最小的问题工作——它只是让注释正常运行。目前,无论方法是否被注释,所有语句都会立即提交。 Spring Boot为您提供了如此多的样板配置,以至于很难找到丢失的链接。 我的包含以下依赖项: 我的包含以下数据源配置: bean中不按预期运行的方法的一个简单示例如下: 引发异

  • 作为一个新的Web应用程序项目的一部分,我计划学习Spring。我开始通读Spring框架参考。当我在谷歌上搜索时,我遇到了Spring boot。我所理解的是,Spring boot通过减少配置帮助构建应用程序的速度比Spring快得多。现在我有点困惑,我应该继续学习Spring还是跳转到Spring boot。我的目的是了解Spring作为一个框架是如何工作的,而不是一些特性。所以请让我知道,

  • 我正在研究Spring支持的数据访问技术,我注意到它提到了多个选项,但我不确定它们之间的区别: Spring-DAO(http://docs.spring.io/spring/docs/2.0.8/reference/dao.html) Spring-orm(http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/htm

  • 问题内容: 有人可以通过实际示例解释注释中的隔离和传播参数吗? 基本上,何时和为什么我应该选择更改其默认值。 问题答案: 好的问题,尽管不是一个简单的答案。 Propagation 定义事务之间的关系。常用选项: :代码将始终在事务中运行。创建一个新事务或重用一个事务(如果有)。 :代码将始终在新事务中运行。如果存在当前事务,则将其挂起。 Isolation 定义事务之间的数据契约。 :允许脏读。

  • 问题内容: 我有一个使用Hibernate 4和Spring Transactions的Spring 3.2应用程序。所有方法都运行良好,我可以正确访问数据库以保存或检索实体。然后,我介绍了一些多线程,并且由于每个线程都在访问数据库,所以我从Hibernate中收到以下错误: 我从网上读到我必须添加 thread 到Hibernate配置中的内容,但是现在每次我尝试访问数据库时,都会得到: 但是,