Как перезапустить транзакции на deadlock/lock-timeout в Spring?

Фактическая команда для Windows, который довольно трудно найти онлайн:

CustomLog '|" "*Apache-Path/bin/rotatelogs.exe" 
    "**Apache-Path*/logs/backup/internet_access_%d-%m-%y.log" 86400' combined

то, Где "internet_access" укусил, является именем, которое Вы выбираете для своих файлов, эти 86400 число секунд за один день. Необходимо изменить Путь Apache к соответствующему каталогу, на котором Вы установили Apache.

23
задан Asaf Mesika 19 November 2009 в 12:11
поделиться

2 ответа

Универсального ответа не существует, поскольку он зависит от специфики приложения. Например, вы можете захотеть выполнить автоматический перезапуск операции с транзакцией или уведомить пользователя об ошибке операции и запросить явное подтверждение повторной попытки и т. Д.

Я бы использовал AOP в случае сценария автоматического перезапуска.

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

Мне кажется, что у Spring должен быть хороший ответ на этот вопрос (по крайней мере, в форме документации или какого-нибудь перехватчика повторов). Увы, это не так.

Вероятно, лучший способ справиться с повторными попытками (если вы хотите оставаться «декларативным» в отношении вещей) - это написать собственную реализацию перехватчика, которая будет автоматически повторять транзакцию заданное количество раз. Для начала изучите Spring TransactionInterceptor , который управляет поведением начала / отката / фиксации декларативных транзакций. Если вы используете Hibernate, обратите внимание, как он обрабатывает привязку / отмену привязки сеанса Hibernate к текущему потоку.

На что следует обратить внимание, если вы используете Hibernate:

  • Ваш «перехватчик повторных попыток» должен обязательно отвязать любой уже существующий сеанс Hibernate с привязкой к потоку и повторно связать новый. Как только исключение (например, взаимоблокировка) возникает из кода Hibernate / JDBC, соответствующий сеанс Hibernate становится отравленным, и его необходимо отбросить. ( session.clear () недостаточно.)
  • Будьте осторожны, если ваши методы транзакционной службы используют объекты сеанса Hibernate в качестве параметров метода. При повторной попытке при сбросе сеанса Hibernate эти объекты будут отсоединены. Вам нужно будет повторно подключить их, если метод службы предполагает, что они прикреплены (например, если они используют ленивые загруженные свойства, к которым осуществляется доступ в методе службы, или если вы пытаетесь их сохранить и т. Д.) В общем, лучше, если вы не используйте объекты Hibernate в качестве параметров транзакционных методов обслуживания.
  • Вы будете реализовывать MethodInterceptor.invoke () - экземпляр MethodInvocation , который передается в this, может иметь состояние; вам может потребоваться клонировать его перед использованием в перехватчике.
15
ответ дан 29 November 2019 в 02:34
поделиться
Другие вопросы по тегам:

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