提问者:小点点

在读查询上hibernate@Transactional(只读=true)是一种不好的做法吗?


我使用Spring(Service Layer and Repository)对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个答案

匿名用户

这是一个很好的优化实践。您可以在Spring Data留档中找到示例。并且您不需要使用@Transactional注释来注释整个服务,因为“… Spring Data JPA存储库实现的CRUD方法已经使用@Transactional注释”Spring Data JPA入门

匿名用户

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

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

如果没有显式地将只读设置为true,则会有读/写事务。

现在回到你的问题

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

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

您可以在此处阅读更多详细信息

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

Spring@事务性只读传播