#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 за подробностями.
Для вашего варианта использования я вижу два варианта:
- используйте программное управление транзакциями, поэтому, если кто-то читает код, очевидно, где находятся границы транзакции
- извлеките объект доступа к данным для вашей логики сохранения с помощью общедоступного метода обновления (обновляет один объект). Вы можете использовать декларативный подход с этим dao.
Более поздний подход помогает вам разделить проблемы, не заботясь о транзакциях и коде, связанном с базой данных, в вашем задании quartz.