readOnly = true là hint cho transaction, không phải enforcement cứng.
Tác dụng:
1. Hibernate tắt dirty checking — không snapshot entity → giảm memory + CPU.
2. Flush mode = MANUAL — không auto-flush.
3. DB có thể optimize — route sang read replica, dùng read-only transaction (Postgres: SET TRANSACTION READ ONLY).
Lưu ý: không chặn write — code vẫn setX() được, chỉ là Hibernate không flush; vài driver ignore hint nếu không support.
Best practice: đặt ở class level, override cho method ghi:
java
@Service
@Transactional(readOnly = true) // default mọi method
class UserService {
public User findById(Long id) { ... }
@Transactional // override cho write
public User create(User u) { ... }
}