Требуется помощь по декларативным транзакциям Spring

#spring #spring-transactions

#spring #spring-транзакции

Вопрос:

Я пишу задание quartz, которое будет выполняться ежедневно и обновлять определенную таблицу базы данных.

Логика для того же заключается в следующем:

1) Извлеките все объекты [поскольку мы используем hibernate], которые нуждаются в обновлении, и обновите 2) Повторите их, получите каждый объект и вызовите отдельный частный метод для выполнения обновления.

Вышеуказанные два шага выполняются внутри общедоступного метода, представляющего задание quartz.

Я хочу убедиться, что даже если обновление для какой-либо записи завершится неудачно, это не должно повлиять на другие записи. Например, если найдено 50 записей и при обновлении 31-й записи возникает ошибка, не следует откатывать предыдущие 30 обновлений.

Может кто-нибудь, пожалуйста, подсказать, какую методологию транзакций следует использовать здесь? Должно ли это быть PROPAGATION_NOT_SUPPORTED или PROPAGATION_REQUIRES_NEW или любым другим?

С уважением

Ответ №1:

Использование декларативного управления транзакциями с частными методами затруднено… см. http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/htmlsingle/#tx-decl-explained за подробностями.

Для вашего варианта использования я вижу два варианта:

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

Более поздний подход помогает вам разделить проблемы, не заботясь о транзакциях и коде, связанном с базой данных, в вашем задании quartz.