Просто требуемый Ваши мнения эксперта о декларативном управлении транзакциями для Spring. Вот моя установка:
save*, readonly = false, rollback for Throwable
Вещи хорошо работают с вышеупомянутой установкой. Однако, когда я говорю get*, readonly = true
, Я вижу ошибки в своем высказывании файла журнала Database connection cannot be marked as readonly
. Это происходит для всех, добираются* методы в обслуживании слой.
Теперь мои вопросы:
A. Сделайте я должен установить get*
как только для чтения? Все мой get*
методы являются чистым чтением операции DB. Я не хочу выполнять их в любом контексте транзакции. Насколько серьезный вышеупомянутая ошибка?
B. Когда я удаляю get*
конфигурация, я не вижу ошибок. Morever, все мое простое get*
операции выполняются без транзакций. Действительно ли это - способ пойти?
C. Почему кто-либо хотел бы иметь транзакционные методы где readonly = true
? Есть ли практическое значение этой конфигурации?
Спасибо! Как всегда, Ваши ответы очень ценятся!
В этом сообщении говорится, что поведение или флаг readOnly
зависит от механизма сохранения.
С. Да, при использовании гибернации это дает преимущества в производительности, устанавливая режим очистки на FLUSH_NEVER
(как описано в связанной публикации)
B. Да, для вызовов JDBC не требуется транзакция (для гибернации она требуется), поэтому удаление конфигурации @Transactional
приводит к сокращению всего управления транзакциями.
А. Я предполагаю, что Spring вызывает connection.setReadOnly (true)
, но ваш драйвер JDBC не поддерживает это
Итог: не используйте только для чтения
транзакции с простым JDBC.
И еще одно - транзакции должны охватывать несколько запросов. Не делайте транзакции слишком детализированными. Сделайте их единицей работы .
А. Должен ли я говорить "get * as readonly"? Все мои методы get * - это чистые операции чтения из БД. Я не хочу запускать их ни в каком контексте транзакции. Насколько серьезна вышеуказанная ошибка?
На самом деле, вы, вероятно, по-прежнему хотите запускать все ваши get ()
в контексте транзакции, чтобы убедиться, что вы получаете согласованные чтения. Если, с другой стороны, вас это не волнует, вы можете установить соответствующий уровень транзакции.
С. Зачем кому-то нужны транзакционные методы, где readonly = true? Есть ли какое-то практическое значение в этой конфигурации?