使用JPA的Spring应用程序中的单个读取查询是否需要事务?

问题描述 投票:0回答:1

我正在学习Java、Spring和MySQL,与大学朋友一起构建SNS服务。我们一直在使用

@Transactional(readOnly=true)
进行单读查询。然而,在深入研究数据库原理后,我了解到“事务的目的是保证一系列数据库操作的完整性”,这引起了一些疑问。

问题:

  1. 单个读取查询是否不需要事务,尤其是在不考虑数据完整性的情况下?例如,当我需要在我的应用程序中检索会员信息时:

    @Service
    @RequiredArgsConstructor
    public class MemberService {
    
     private final MemberRepository memberRepository;
    
     @Transactional(readOnly=true)
     public Member findMemberById(Long memberId) {
         return memberRepository.findMemberById(memberId)
             .orElseThrow(MemberNotFoundException::new);
     }
    }
    
  2. 如果我查询一个会员,然后使用该会员的昵称搜索该会员撰写的帖子,则昵称可能会在初始查询后发生变化。在这种情况下,是否有必要使用交易,还是我想多了?

  3. 如果一系列操作中有特定部分需要数据库事务,是否最好缩小事务范围并将其仅应用于那些必要的部分?

    //begin transaction
    saveMember();
    //end transaction
    
    sendEmail();
    
    //beigin transaction
    saveEmail();
    //end transaction
    
    sendNotification();
    

我英语不好,但感谢您的阅读!

java mysql database spring-boot transactions
1个回答
0
投票

在使用 JPA 的 Spring 应用程序中,事务对于单个读取查询来说并不是绝对必要的,但由于以下原因,包含它通常是一个好习惯:

  • 一致性:尽管读取操作通常不会修改数据,但它可以确保检索到的数据与事务开始时的数据库状态一致。如果没有事务,就有可能读取不一致或过时的数据,尤其是在其他事务可能正在修改数据的并发环境中。

  • 资源管理:事务有助于有效管理数据库连接和其他资源。它们确保资源得到正确分配和释放,防止资源泄漏并提高性能。

  • 延迟加载:如果您的实体对某些关系使用延迟加载,则拥有事务可确保可以在事务范围内延迟加载这些关系。如果没有事务,当尝试访问事务上下文之外的延迟加载属性时,您可能会遇到“LazyInitializationException”。

  • 异常处理:事务提供了一种处理异常并在必要时回滚更改的机制。尽管读取操作不太可能导致异常,但拥有事务上下文可以在整个应用程序中实现一致的错误处理。

因此,虽然单个读取查询可能并不严格需要事务,但通常建议将其包含在内,以实现一致性、资源管理,并避免与延迟加载和异常处理相关的潜在问题。

© www.soinside.com 2019 - 2024. All rights reserved.