2016-08-05 8 views
1
@Transactional 
public void setSomething(String name) { ... } 

Извините, что задал этот очень простой вопрос: весенняя транзакционная аннотация настолько мощная, но еще сложная для понимания. Основываясь на вышеприведенном коде, у меня нет управления rollbackFor, то есть если есть исключение, этот транзакционный контекст не будет откатом. Но исходя из моего прежнего опыта по охвату блока транзакций, если откат для исключения отсутствует, commit будет пропущен и приведет к блокировке таблицы базы данных (Oracle) (приостановка, другой пользователь не может выполнить их SQL). Будет ли Spring иметь такую ​​же проблему, не используя rollbackFor?Весна Транзакция без отката

ответ

4

rollbackFor и соответствующие параметры предназначены для точной настройки. Если вы их опустите, поведение по умолчанию - откат для RuntimeExceptions. Другие исключения не выполняют откат, и любые изменения, внесенные в базу данных, будут совершены.

Сделка совершена или откатна, метод @Transactional не приведет к неисполненной транзакции (по крайней мере, при нормальной работе).

5

Настройки по умолчанию/@ транзакционные настройки:

  • установка Размножение ТРЕБУЕТСЯ.
  • Уровень изоляции DEFAULT.
  • Сделка считывается/записывается.
  • Тайм-аут транзакции по умолчанию равен таймауту по умолчанию базовой системы
  • или нет, если тайм-ауты не поддерживаются.
  • Любое исключение RuntimeException вызывает откат, и любые проверенные исключения этого не делают.

Так что в вашем случае это будет отменено, если у вас будет исключение RuntimeException.

Но, как правило, недостаточно сказать, что вы просто аннотируете свои классы с помощью аннотации @Transactional, добавьте @EnableTransactionManagement к своей конфигурации.

Вы можете точно определить, какие типы исключений отмечают транзакцию для отката, включая проверенные исключения. Следующий фрагмент XML демонстрирует, как вы настраиваете откаты для проверенного типа исключения для приложения.

<tx:advice id="txAdvice" transaction-manager="txManager"> 
<tx:attributes> 
<tx:method name="get*" read-only="true" rollback-for="NoProductInStockException"/> 
<tx:method name="*"/> 
</tx:attributes> 

Или с аннотациями

@Transactional(rollbackFor=NoProductInStockException.class) 

Подробная документация Вы можете найти здесь: http://docs.spring.io/autorepo/docs/spring/4.2.x/spring-framework-reference/html/transaction.html

Надежда, что помогает.