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

is hibernate @Transactional(readOnly=true) on read query a bad practice?

我使用 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 是一种不好的做法吗?性能怎么样?

首先,由于 Spring 本身不进行持久化,因此只读只是对行为提供者的提示(例如 Hibernate)

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

如果您没有明确地将 readOnly 设置为 true,您将有 read/write 个事务。

现在回到你的问题

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

所以最好将其标记为 readonly,让您的提供商知道您只读。

您可以在此处详细阅读

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

Spring @Transactional read-only propagation

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