休眠@Transactional(readOnly = true)的读取查询是一种不好的做法吗?

时间:2018-07-25 07:43:00

标签: spring spring-data-jpa transactional

我使用Spring(服务层和存储库)在mysql数据库上执行CRUD操作。

MyServiceImpl:

@Service
@Transactional
public class MyServiceImpl implements MyService {
 private final MyRepository myrepo;
 ....

 @Transactional(readOnly = true)
 public Optional<myObj> findOne(Long id) {
    return myrepo.findById(id);
 }
}

对读取操作使用readonly = true是一种不好的做法吗?性能如何?

2 个答案:

答案 0 :(得分:1)

这是一个好的优化实践。您可以在Spring Data文档中找到示例。而且,您不需要使用@Transactional注释来注释整个服务,因为“ Spring Data JPA存储库实现的..CRUD方法已经使用@Transactional进行了注释”。 Getting started with Spring Data JPA

答案 1 :(得分:0)

首先,由于Spring本身不会执行持久性,因此readonly仅是提供者有关行为的提示(例如Hibernate)

根据Hibernate的行为,readonly=true将在当前会话中设置FlushMode.NEVER,这将阻止提交事务。

如果未将readOnly显式设置为true,则将具有读/写事务。

现在回到您的问题

查看您的findOne方法。看起来您正在从数据库进行Read调用。

因此,最好将其标记为readonly,以使您的提供者知道您正在阅读。

您可以在此处详细了解更多

https://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/transaction.html

Spring @Transactional read-only propagation