`isolation` maps to the database isolation level (how concurrent reads/writes interact). `readOnly = true` is usually a hint for the framework/driver to optimize, but it does not automatically prevent writes in all cases. Also remember: `@Transactional` works via proxies, so it won’t apply on self-invocation.
Expanding on the short answer — what usually matters in practice:
A tiny example (an explanation template):
// Example: discuss trade-offs for "`@transactional`-isolation-and-`readonly`:-what-"
function explain() {
// Start from the core idea:
// `isolation` maps to the database isolation level (how concurrent reads/writes interact). `
}