Java 界定服务或业务中的交易

Java 界定服务或业务中的交易,java,spring,jpa,Java,Spring,Jpa,根据jpa存储库,实例是事务性的,但在其他参考书目中说,事务应该在服务层声明。更好的方法是什么?当以事务方式执行单个JPA存储库方法时,通常需要执行事务,包括各种JPA存储库方法调用 考虑将金额从一个帐户转移到另一个帐户的经典方法。如果在传输过程中的任何阶段发生错误,则必须回滚。因此,整个(服务)方法是@Transactional: @Transactional public void transfer(Account a, Account b, int amount) { a.redu

根据jpa存储库,实例是事务性的,但在其他参考书目中说,事务应该在服务层声明。更好的方法是什么?

当以事务方式执行单个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
,或者在XML配置的情况下使用

Spring数据JPA存储库的默认方法是事务性的,您可能添加的任何自定义方法都必须显式注释为事务性的。事务传播是一个不同的主题和不同的传播类型,对于它们的使用有不同的建议。i、 e一个是新的服务层,对DAO是必需的。