繁体   English   中英

Spring JPA存储库中的@Transaction行为

[英]@Transaction behaviour in Spring JPA Repository

所以我有一个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的事务机制如何工作。 我将尝试给出一个简短的概述,但这现在是详尽无遗的。 事务是您在任何系统上执行的逻辑操作。 我之所以说Logical是因为一项特定的交易,我可能不得不更新2条记录(付款和订单跟踪,如果您想考虑一个示例)。 并且,如果其中一个更新由于某种原因而失败,则另一个更新也应失败。 即使更新了2条记录,整个操作也是原子的。 因此,我们将这两个操作称为一个事务。

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

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

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

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

这不是给您代码,而是让您更多地了解事务,表锁定以及进行此操作的替代设计。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM