[SPRING] Spring 3 / Hibernate에서 트랜잭션을 롤백하기위한 베스트 프랙티스
SPRINGSpring 3 / Hibernate에서 트랜잭션을 롤백하기위한 베스트 프랙티스
Spring 문서 참조 :
javapractices.com 참조
비즈니스 로직을 수행하는 동안 문제가 발견되어 변경 사항을 롤백하려면 새로운 RuntimeException을 던져야합니다. 논리에서 식별 했으므로 RuntimeException (확인되지 않은 예외)이 아닙니다. 또는 아마도 나는이 개념을 오해하고 있습니까?
내 진짜 질문, 내 트랜잭션 서비스 롤백에 대한 모범 사례는 무엇입니까?
해결법
-
==============================
1.확인 된 예외를 사용하는 경우 @Transactional 주석의 rollbackFor 속성에 추가하면됩니다.
확인 된 예외를 사용하는 경우 @Transactional 주석의 rollbackFor 속성에 추가하면됩니다.
@Transactional(rollbackFor = { MyInvalidUserException.class, MyApplicationException.class }) public void method() throws MyInvalidUserException, MyApplicationException { ... ... }
기타
org.life.java의 대답도 잘 동작합니다. 프로그래밍 방식의 트랜잭션 관리를 선언적 트랜잭션과 혼용하거나 엄격하게 선언적으로 유지하려는 경우 학계의 결정입니다.
-
==============================
2.프로그래밍 방식으로 내부에서 롤백 :
프로그래밍 방식으로 내부에서 롤백 :
@Transactional public void commit() { try { // some business logic... } catch (ConstraintViolationException e) { // trigger rollback programmatically TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } }
또는 롤백에 대한 예외를 표시하고 호출자로부터 처리하십시오.
@Transactional(rollBackFor = TransactionException.class) public void commit() throws ConstraintViolationException{ try { // some business logic... } catch (ConstraintViolationException e) { // handle the exception // re-throw for rollback new TransactionException(e); } } public void doCommit(){ try { commit() } catch (TransactionException e){ // do nothing as already handled } }
전 코드를 더 간단하게 유지하면서 이전 코드를 선호하지만 Spring docs에 따르면 낙심하고 있습니다.
-
==============================
3.그것은 같아야한다.
그것은 같아야한다.
@Transactional public void method () throws YourCustomException { try{ //logic }catch(Exception ex){ TransactionAspectSupport.currentTransactionStatus() .setRollbackOnly(); throw(new YourCustomException(ex.getMessage())); } }
-
==============================
4.예외를 확인해야한다는 의견이 다르다고 말하는 것이 안전하다고 생각합니다. 예를 들어 Spring Framework 소개에서 발췌 한 내용을 살펴 보자.
예외를 확인해야한다는 의견이 다르다고 말하는 것이 안전하다고 생각합니다. 예를 들어 Spring Framework 소개에서 발췌 한 내용을 살펴 보자.
데이터 액세스 예외는 분명히 프로그램의 직접적인 제어 밖에 있으므로 javapractices에 따라 검사해야합니다. 그러나 봄의 원천에있는 사람들은 다릅니다. 그리고 나는 그들의 판단을 javapractices보다 더 믿습니다.
따라서 트랜잭션을 롤백해야 함을 나타 내기 위해 검사되지 않은 예외를 throw하는 것은 아무 문제가 없습니다. 물론 체크 된 예외를 사용할 수도 있고 애스펙트를 롤백하도록 애스펙트를 구성 할 수도 있습니다. (자세한 내용은 Affe의 답변 참조)
-
==============================
5.확인 된 & 확인되지 않은 예외 처리, 트랜잭션 관리를 위해이 URL에서 왔습니다. 주석 중심 접근 방식은 아니지만 좋은 방법입니다.
확인 된 & 확인되지 않은 예외 처리, 트랜잭션 관리를 위해이 URL에서 왔습니다. 주석 중심 접근 방식은 아니지만 좋은 방법입니다.
http://javasight.wordpress.com/2009/02/17/understanding-spring-transaction-management-with-checked-and-unchecked-exceptions/
from https://stackoverflow.com/questions/4402506/best-practices-for-rolling-back-transactions-in-spring-3-hibernate by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 스프링 CrudRepository 예외 (0) | 2019.03.05 |
---|---|
[SPRING] 두 개의 MVC 구성으로 봄 부팅 (0) | 2019.03.05 |
[SPRING] HttpServletRequestWrapper, setReadListener 예제 구현 / isFinished / isReady? (0) | 2019.03.05 |
[SPRING] XML Bean은 Spring Boot 애플리케이션에 어디에 넣어야합니까? (0) | 2019.03.05 |
[SPRING] JDBCTemplate.queryForMap을 사용하여지도 데이터를 얻는 방법 (0) | 2019.03.05 |