Spring Boot JPA @Transactional隔离级别属性不生效问题排查
问题:READ_COMMITTED/READ_UNCOMMITTED隔离级别下重复查询未读取外部事务更新数据
使用READ_UNCOMMITTED或READ_COMMITTED隔离级别时,即使另一个事务更新了某行数据,同一事务内的多次查询仍返回相同结果。已通过pg_stat_activity日志确认每次查询都会执行,因此可以排除Hibernate一级缓存的影响。
代码示例
@Transactional(isolation = Isolation.READ_COMMITTED) public void checkTransactional() { List<Subject> subjects = subjectRepository.findAllByTutorID(2l); // statement 1 List<Subject> subjects1 = subjectRepository.findAllByTutorID(2l); // statement 2 }
执行前表状态
| id | name | tutorial_id |
|---|---|---|
| 7 | Mohan | 2 |
| 8 | Sohan | 2 |
应用执行步骤
- 执行statement 1后,
subjects结果为[(7, "Mohan", 2), (8, "Sohan", 2)] - 在执行statement 2前暂停调试,通过命令行执行更新:
update subjects set name = 'Tohan' where id = 8;
此时表状态更新为:id name tutorial_id 7 Mohan 2 8 Tohan 2 - 恢复应用执行statement 2后,
subjects1结果仍与statement 1相同:[(7, "Mohan", 2), (8, "Sohan", 2)]
当前现象完全符合REPEATABLE_READ隔离级别的表现,但数据库已设置为read_committed,使用Isolation.READ_UNCOMMITTED也会出现相同结果。预期statement 2应返回[(7, "Mohan", 2), (8, "Tohan", 2)],求问原因。
内容的提问来源于stack exchange,提问作者Arun Kumar
相关产品推荐
相关产品推荐

