gpt4 book ai didi

java - Spring JPA 存储库中的 @Transaction 行为

转载 作者:行者123 更新时间:2023-12-01 11:28:19 24 4
gpt4 key购买 nike

所以我有一个 Spring JPA 存储库:

@Transactional(readOnly = true)
public interface UsageReportsRepository extends JpaRepository<UsageReports, Long> {

@Query(value = "select u from UsageReports u where u.username=:username AND u.requestType='USER_ACTIVITY' ORDER BY u.activityEndTime DESC")
public List<UsageReports> getLastActiveTime(@Param("username") String username, Pageable pageable);

}

以及两个使用此存储库的过滤器。

public class UsageReportingInterceptor implements HandlerInterceptor {

@Autowired
private UsageReportsRepository usageReportsRepository;

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// Do stuff
usageReportsRepository.save(usageReportsBean)
}
}


public class DumpToFile {

@Autowired
private UsageReportsRepository usageReportsRepository;

@Override
public boolean dumpToFile() throws Exception {
// Do stuff
List<UsageReports> usageReports = usageReportsRepository.findAll()
usageReportsRepository.deleteAll()
// Write to file
}
}

我觉得不需要服务层,因此我直接从过滤器调用它们。一个过滤器使用此存储库插入数据,另一个过滤器清除数据并将其放入文件中。两者都是独立的,可以按任意顺序执行。我想确保在此过程中不会丢失任何数据。 @Transactional 注释是否足以满足此目的?如果不是我还应该做什么?

最佳答案

根据您的评论,我了解到对 dumpToFile 的调用是完全随机的,并且可能会发生这种情况,因此您的 findAll 和 deleteAll 之间存在保存。

在进一步讨论之前,我建议您仔细阅读一下什么是事务以及 Spring 的事务机制如何工作。我将尝试给出一个简短的概述,但现在已经很详尽了。事务是您在任何系统上执行的逻辑操作。我说逻辑是因为一笔特定的交易,我可能需要更新 2 条记录(付款和订单跟踪,如果你想举个例子的话)。如果其中一个更新由于某种原因失败,则另一个更新也应该失败。即使更新了 2 条记录,整个操作也是原子的。因此,我们将这两个操作称为一个事务。

还有其他参数[ACID],但单个事务应该是单个逻辑操作。

就您而言,您将整个存储库标记为只读。 【事务有多种类型,只读只能读取数据,不能修改数据】。所以我不确定你的删除是否会发生。但是,如果您更改配置以允许删除,那么我们就会遇到不同的问题。锁定问题。

只读事务通常不会(有警告)锁定您正在读取的表。如果您希望在执行 findAll 和 deleteAll 时锁定表,您可以将这两个包装在单个事务中,将表标记为锁定(这将防止其他查询被阻止,直到当前事务完成),执行你的事情和提交/回滚。提交/回滚释放锁。其他查询继续执行。

这只是一种方法。另一种方法是同步对存储库的访问并以 Java 方式锁定事务(尽管我不推荐它)。可能还有其他方法,但出于多种原因,良好的设计不应理想地锁定整个表。

这不是给你代码,但我的想法是让你更多地了解事务、表锁定并考虑这样做的替代设计。

关于java - Spring JPA 存储库中的 @Transaction 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30624858/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com