为什么我们需要在 Spring Data JPA 中用 @Transactional 注释服务 class

Why do we need to annotate the Service class with @Transactional in Spring Data JPA

在 spring 启动应用程序中,我们有扩展 JpaRepository 的用户定义存储库接口。 JpaRepository 反过来有一个实现 class SimpleJpaRepository。 SimpleJPARepository 上有 2 个注释

  1. @交易
  2. @存储库

因此我们可以在扩展 JpaRepository 的用户定义的存储库接口上跳过这 2 个注释。 那为什么我们需要在服务 class 上显式添加 @Transactional ,它也只使用我们的用户定义的存储库对象?

这是一个有与有的问题。

一个对象可以是Transactional,或者有一个成员对象是Transactional

如果对象有一个成员对象是 Transactional,它不会自动成为 Transactional 本身。

对象 A 包含对象 B,它是 Transactional,不会使对象 A Transactional

具有事务性注释的要点是,注释方法中的所有内容都发生在同一工作单元中,并且要么全部成功,要么全部失败。将事务仅放在每个存储库上意味着每个存储库都可以有自己的事务,第二个失败不会回滚第一个。

您可以在服务上使用非事务性方法,或者将 class 注释为服务的每个方法并不意味着 spring 可以假设一切都是事务性的。