根据this jpa存储库实例是事务性的,但在其他参考书目中说应该在服务层声明事务。什么是更好的方法?
答案 0 :(得分:1)
虽然以事务方式执行单个JPA存储库方法,但通常需要执行包括各种JPA存储库方法调用的事务。
考虑将金额从一个帐户转移到另一个帐户的经典方法。如果在传输过程中的任何阶段发生错误,则必须回滚。因此,整个(服务)方法是@Transactional
:
@Transactional
public void transfer(Account a, Account b, int amount) {
a.reduce(amount);
b.add(amount),
accountRepository.save(a);
accountRepository.save(b);
}
此处,即使保存帐户b的错误也不会改变帐户a的持久状态,因为transfer
方法中的所有内容都会回滚。
要在Spring中启用事务管理,请在Java @EnableTransactionManagement
类上使用@Configuration
,或在XML配置时使用<tx:annotation-driven/>
。