我可以提交 @Transactional 序列的一部分吗?

Can I commit a portion of an @Transactional sequence?

我有一个 Spring 引导应用程序,并且有一个网络服务,用户可以在其中 POST CollegeCourse 实例的模型,其中包括 class 和学生之间的链接服用它。 (数据用于存储关联 table 中的行,因为那些 class 具有多对多关系。)这很好用。

说课程的注册有变化。用户希望将相同的 JSON 结构发送到处理 PUT 调用的 Web 服务。代码采用了简单的更新方式,首先查找并删除所有现有的 CollegeCourse-Student 链接,然后保存新链接。 (而不是遍历两个列表,匹配项目。)这部分也按给定的方式工作。

然后我们向 CollegeCourse-Student 关联添加了一个唯一性约束 table,这样 table 就不能让一个 Student 多次链接到一个 CollegeCourse。这坠毁并燃烧。调试会话揭示了罪魁祸首:在事务完成之前,删除 CollegeCourse-Student 记录并没有真正将它们从数据库中删除。因此,当我们尝试重新添加新链接时,原始 POST 中的任何保留都与数据库中已有的内容发生冲突。

处理 PUT 的服务前面有 @Transactional 注释。我尝试移动代码以在单独的方法中查找和删除关联,并尝试了 @Transactional(propagation=Propagation.REQUIRED) 和 REQUIRES_NEW,但都没有阻止唯一性约束失败。我还在我的应用程序 class 中添加了 @EnableTransactionManagement - 同样的故事。我的困境有简单的解决方案吗?

在不知道您的存储库具体是什么样子的情况下,您是否尝试过在删除后对实体管理器进行手动刷新?

类似于

entityManager.flush();

或者,如果您正在使用 Spring Data JPA 存储库,您应该能够在该接口中定义一个 flush 方法并调用它。