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

이 매우 기본적인 질문은 죄송합니다. 스프링 트랜잭션 주석은 매우 강력하지만 이해하기가 어렵습니다. 위의 코드를 기반으로, 나는 rollbackFor 컨트롤이 없다. 즉, 예외가 있으면이 트랜잭션 컨텍스트는 롤백되지 않는다. 그러나 트랜잭션 블록을 다루는 옛 경험에 비추어 볼 때 예외 롤백이 없다면 commit은 건너 뛰게되고 (Oracle) 데이터베이스의 테이블이 잠기 게됩니다 (일시 중지되고 다른 사용자는 SQL을 커밋 할 수 없습니다). 윌 스프링은 rollbackFor을 사용하지 않고 동일한 문제가 있습니까?스프링 트랜잭션 롤백없는 트랜잭션

답변

4

rollbackFor 및 관련 매개 변수는 미세 조정을위한 것입니다. 이를 생략하면 기본 동작은 RuntimeExceptions에 대한 롤백입니다. 다른 예외는 롤백을 수행하지 않으며 데이터베이스에 대한 모든 변경이 확약됩니다.

트랜잭션이 커밋되거나 롤백 되었기 때문에 (적어도 정상적인 작동에서는) 트랜잭션이 종결되지 않을 수 있습니다.

5

기본/@ 트랜잭션 설정은 다음과 같습니다

  • 전파 설정이 필요합니다.
  • 격리 수준은 DEFAULT입니다.
  • 트랜잭션이 읽기/쓰기입니다.
  • 트랜잭션 시간 초과는 기본
  • 트랜 잭션 시스템의 기본 시간 초과를 기본값으로하며, 시간 초과가 지원되지 않으면 none이됩니다.
  • 모든 RuntimeException은 롤백을 트리거하며 확인 된 예외는 입니다.

따라서 RuntimeException이 발생하면이 경우 롤백됩니다.

일반적으로 @Transactional 주석으로 클래스에 주석을 달고 구성에 @EnableTransactionManagement를 추가한다고 말하는 것으로는 충분하지 않습니다.

확인 된 예외를 포함하여 롤백을 위해 트랜잭션을 표시하는 정확한 예외 유형을 구성 할 수 있습니다. 다음 XML 스니 j은 선택된 응용 프로그램 특정 Exception 유형에 대해 롤 i을 구성하는 f}을 보여줍니다. http://docs.spring.io/autorepo/docs/spring/4.2.x/spring-framework-reference/html/transaction.html

희망하는 데 도움이 :

또는 주석

당신이 여기에서 찾을 수 있습니다
@Transactional(rollbackFor=NoProductInStockException.class) 

자세한 문서와

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

.