为什么我们需要在 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 个注释
- @交易
- @存储库
因此我们可以在扩展 JpaRepository 的用户定义的存储库接口上跳过这 2 个注释。
那为什么我们需要在服务 class 上显式添加 @Transactional ,它也只使用我们的用户定义的存储库对象?
这是一个有与有的问题。
一个对象可以是Transactional
,或者有一个成员对象是Transactional
。
如果对象有一个成员对象是 Transactional
,它不会自动成为 Transactional
本身。
对象 A 包含对象 B,它是 Transactional
,不会使对象 A Transactional
。
具有事务性注释的要点是,注释方法中的所有内容都发生在同一工作单元中,并且要么全部成功,要么全部失败。将事务仅放在每个存储库上意味着每个存储库都可以有自己的事务,第二个失败不会回滚第一个。
您可以在服务上使用非事务性方法,或者将 class 注释为服务的每个方法并不意味着 spring 可以假设一切都是事务性的。
在 spring 启动应用程序中,我们有扩展 JpaRepository 的用户定义存储库接口。 JpaRepository 反过来有一个实现 class SimpleJpaRepository。 SimpleJPARepository 上有 2 个注释
- @交易
- @存储库
因此我们可以在扩展 JpaRepository 的用户定义的存储库接口上跳过这 2 个注释。 那为什么我们需要在服务 class 上显式添加 @Transactional ,它也只使用我们的用户定义的存储库对象?
这是一个有与有的问题。
一个对象可以是Transactional
,或者有一个成员对象是Transactional
。
如果对象有一个成员对象是 Transactional
,它不会自动成为 Transactional
本身。
对象 A 包含对象 B,它是 Transactional
,不会使对象 A Transactional
。
具有事务性注释的要点是,注释方法中的所有内容都发生在同一工作单元中,并且要么全部成功,要么全部失败。将事务仅放在每个存储库上意味着每个存储库都可以有自己的事务,第二个失败不会回滚第一个。
您可以在服务上使用非事务性方法,或者将 class 注释为服务的每个方法并不意味着 spring 可以假设一切都是事务性的。