Недавно я столкнулся с ситуацией, когда транзакция не откатилась назад. Я также подумал, что в транзакциях JPA есть ошибки? Я слишком много думаю ...
Чтобы четко напечатать журналы, я добавляю TyrCatch, чтобы распечатать журналы в уловке. Но ситуация здесь наступает. Когда этот метод является ненормальным, журнал печатается, но дополнительная транзакция не откатается назад.
пример:
Подобные методы не будут откатываться (один метод ошибки, другой метод не откатится):
if (userave) {try {userdao.save (user); userCapability quotadao.save (CapabilityQuota); } catch (Exception e) {logger.info ("Возможность открыть интерфейс, исключение открытия учетной записи, исключение:"+e); }}Следующий метод откатится (один метод ошибки, другой метод откатится):
if (userave) {try {userdao.save (user); userCapability quotadao.save (CapabilityQuota); } catch (Exception e) {logger.info ("Возможность открыть интерфейс, исключение открытия учетной записи, исключение:"+e); бросить новый runtimeexception (); }}или:
if (userave) {try {userdao.save (user); userCapability quotadao.save (CapabilityQuota); } catch (Exception e) {logger.info ("Возможность открыть интерфейс, исключение открытия учетной записи, исключение:"+e); TransactionAspectSupport.currentTransactionStatus (). SetroLlbackOnly (); }}Почему ты не можешь выйти? ? Это не понимает механизм транзакции пружины. ! !
***** Транзакция пружины по умолчанию откатится только после того, как происходит неверная runtimeexcetpion. *******
Принцип захвата исключений SpringAOOP: перехваченный метод должен явно бросить исключение и не может быть обработан каким -либо образом. Таким образом, агент AOP может поймать за исключением метода и откатиться назад. По умолчанию AOP только захватывает исключение Runtimeexception, но может пройти.
Настройка, чтобы поймать конкретные исключения и откатить
Другими словами, не используйте TryCatch в методе обслуживания или добавляйте thrownewRuntimeexcetpion () в улов, чтобы программа была поймана AOP и откатается, когда программа является исключительной.
Решение:
Решение 1. Например, если уровень обслуживания обрабатывает транзакции, то метод в службе не выполняет захват исключений или добавляет оператор брошенного обращения к оператору Catch, чтобы AOP захватывает исключение, а затем откатывается назад, а верхний уровень обслуживания (клиент Webservice Client, View Layer Daise) должен продолжать ловить и обрабатывать исключение.
Решение 2. Добавить: TransactionAseppectSupport.currentTransactionStatus (). Setrollbackonly (); Заявление о вынесении заявления о методе уровня обслуживания, вручную, вручную, чтобы верхний уровень не нуждался в исключениях (текущая практика проекта)
Суммировать
Выше приведено все содержимое этой статьи об анализе экземпляров обмолков исключений с пружинной транзакцией. Я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!