我使用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是一种不好的做法吗?性能呢?
这是一个很好的优化实践。您可以在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@事务性只读传播