Spring - транзакция, только для чтения

Просто требуемый Ваши мнения эксперта о декларативном управлении транзакциями для Spring. Вот моя установка:

  1. Уровень DAO является простым JDBC использование Spring JdbcTemplate (Не В спящем режиме и т.д.),
  2. Уровнем служб является POJO с декларативными транзакциями следующим образом - 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? Есть ли практическое значение этой конфигурации?

Спасибо! Как всегда, Ваши ответы очень ценятся!

23
задан melihcelik 24 November 2011 в 16:06
поделиться

2 ответа

В этом сообщении говорится, что поведение или флаг readOnly зависит от механизма сохранения.

С. Да, при использовании гибернации это дает преимущества в производительности, устанавливая режим очистки на FLUSH_NEVER (как описано в связанной публикации)

B. Да, для вызовов JDBC не требуется транзакция (для гибернации она требуется), поэтому удаление конфигурации @Transactional приводит к сокращению всего управления транзакциями.

А. Я предполагаю, что Spring вызывает connection.setReadOnly (true) , но ваш драйвер JDBC не поддерживает это

Итог: не используйте только для чтения транзакции с простым JDBC.

И еще одно - транзакции должны охватывать несколько запросов. Не делайте транзакции слишком детализированными. Сделайте их единицей работы .

23
ответ дан 29 November 2019 в 02:41
поделиться

А. Должен ли я говорить "get * as readonly"? Все мои методы get * - это чистые операции чтения из БД. Я не хочу запускать их ни в каком контексте транзакции. Насколько серьезна вышеуказанная ошибка?

На самом деле, вы, вероятно, по-прежнему хотите запускать все ваши get () в контексте транзакции, чтобы убедиться, что вы получаете согласованные чтения. Если, с другой стороны, вас это не волнует, вы можете установить соответствующий уровень транзакции.

С. Зачем кому-то нужны транзакционные методы, где readonly = true? Есть ли какое-то практическое значение в этой конфигурации?

  1. Для защиты от ошибочной записи в методах get () `
  2. В целях оптимизации. Мало того, что Hibernate может использовать эту информацию, как упомянул Божо, но некоторые базы данных / драйверы JDBC также могут использовать эту информацию.
5
ответ дан 29 November 2019 в 02:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: