Это только подсказка. Параметр readOnly не гарантирует его поведение, это всего лишь подсказка, которая может или не может быть принята во внимание. Источник
Это просто подсказка для подсистема фактических транзакций; это не обязательно приведет к сбою попыток доступа для записи. Диспетчер транзакций, который не может интерпретировать подсказку только для чтения, не будет выдавать исключение при запросе транзакции только для чтения, а просто молча игнорирует подсказку.
он тесно связан с настройкой распространения. Например: для SUPPORT флаг readOnly никогда не будет использоваться; для REQUIRES_NEW всегда; для ОБЯЗАТЕЛЬНЫХ это зависит от того, находимся ли мы уже в транзакционном контексте или нет, и т. д. c.