我很难理解如何决定使用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注释,为什么?
一般回答
查找定义实际事务的操作--在本例中是transfer
方法。此方法本身表示一个完整的事务,因此您应该将其标记为
@Transactional(propagation = REQUIRED)
您需要保护其他方法不被错误地从事务中调用,因此对它们进行注释是一个好主意
@Transactional(propagation = MANDATORY)
Spring专用答案
默认情况下,Spring使用代理对象实现诸如事务之类的建议,并且自调用(在this
上隐式或显式调用的不通过代理对象的方法)不应用建议。这意味着在这种情况下,Spring实际上不会强制执行deft
和destors
方法的建议,尽管它仍然会保护它们不被其他东西在事务外部调用。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配置中的内容,但是现在每次我尝试访问数据库时,都会得到: 但是,