Spring Data JPA不能与事务隔离“READ_UNCOMMITTED”一起使用

时间:2017-11-21 10:06:02

标签: spring postgresql hibernate transactions spring-data

有两个线程,每个线程绑定两个事务:

DEBUG o.s.orm.jpa.JpaTransactionManager - Creating new transaction with name [com.workflow.consumer.RecordEventConsumer$MockitoMock$1882263982.handleRecordsAddedEvent]: PROPAGATION_REQUIRED,ISOLATION_READ_UNCOMMITTED; ''

Creating new transaction with name [com.workflow.statemachine.action.CreateContentAction.execute]: PROPAGATION_REQUIRED,ISOLATION_READ_UNCOMMITTED; ''

两个隔离级别均为READ_UNCOMMITTED。但是当第一个线程用

在数据库中插入一些东西时
repository.saveAndFlush(contextObject)

存储库为JpaRepository<T, I> repository

还有插入发生的实际日志DEBUG org.hibernate.SQL - insert into task_unit ...etc

来自第二个线程的事务仍然无法使用以下任何一个检索此对象:

repository.getOne(id);
repository.findOne(id);
entityManager.find(class, id);

不仅如此,我还尝试直接连接到数据库并触发

BEGIN TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT * from task_unit

仍然没有成功。

我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

如果我正确地阅读了您的问题,那么本手册就是答案:

https://www.postgresql.org/docs/9.6/static/transaction-iso.html

  

在PostgreSQL中,您可以请求任何四种标准交易   隔离级别,但内部只有三个不同的隔离级别   实现,即 PostgreSQL的Read Uncommitted模式表现得像   阅读提交。这是因为它是映射的唯一合理方式   PostgreSQL的多版本并发性的标准隔离级别   控制架构。

强调我的