
[英]Spring Data JPA does not work with transaction isolation “READ_UNCOMMITTED”
[英]How to set transaction isolation per request using Hibernate + Dropwizard + Guice for DI and Spring Data JPA?
如何在不使用 Spring 作为 DI 框架的情况下(因为它提供了为该事务提供自定义隔离级别的@Transactional
注释),我能否在 web 服务中为基于 Dropwizard + ZF8CB334B31350A13DFAC 构建的 web 服务具有简单的自定义隔离级别DI) + Spring 数据 JPA + PostgreSQL(所有最新版本)?
这是具有完全相同堆栈的 web 服务的简单工作示例(非常欢迎拉取请求): https://github.com/jeep87c/dropwizard-guice-springDataJPA-hibernate
我们使用 Spring 数据 JPA 作为 Hibernate 之上的抽象层,这样我们就不用为每个 DAO 编写自己的实现了。 在理想的世界中,它是 web 服务对 Spring 的唯一依赖,但正如您将在此代码示例中看到的那样,我们正在通过使用beanFactory
8 beanFactory 框架解决 DAO 实现来进行某种破解。然后我们可以在 Guice 中注册这些。 (如果你有一个更好的解决方案,我非常愿意接受,但这不是这个问题的主题)
在此代码示例中, AbsenceResource.create
自愿执行接收到的有效负载的 dup persist。 还有一个验收测试AbsenceResourceAcceptanceTest.rollbackTest
测试这个受损的 API 路由,期望回滚发生。
这里的业务需求是,要创建一个新的缺勤,它必须首先验证同一公司的同一员工是否没有其他缺勤与该缺勤相冲突。 我提供的示例存储库实际上比我的现实生活场景更简单,实际上它必须验证多租户(每公司)环境中员工与缺勤和休假实体的冲突,每个实体有一个表(多租户和列过滤在公司 ID 上)。
为了防止任何并发问题导致导致错误插入两个冲突缺席的竞争条件,我们希望根据PostgreSQL 文档将这种特定事务的隔离级别设置为可序列化,这是避免这种情况的唯一选择的问题。
我们研究了dropwizard-hibernate库,但不幸的是,它没有提供任何方法来设置每个事务的隔离级别。
因此,在我花费数小时将 Guice 替换为 Spring 作为我们 web 服务中的 DI 框架(因为它现在看起来是唯一的选择)之前,我正在寻找其他潜在的简单解决方案来实现相同的目标。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.