0

우리는 예외가 LDAP DAO를 호출에 발생하면이Spring 트랜잭션이

@Service 
@Transactional 
public class DoSomeServiceImpl1 implements IDoSomeService { 

@Override 
public void doSomething() throws SomeException { 
    //dao calls (database insert) 
    //ldap dao call (ldap insert) 
} 

처럼가는 서비스 클래스를 롤백하지 않습니다 데이터베이스에 삽입 된 데이터가 남아 롤백하지 않습니다.

는 LDAP 호출 방법은

public void insertLDAPRecord() throws SomeException { 
     try { 
     //ldap insert logic 
     } catch (LDAPException e) { 
      throw new SomeException("ldapexception",e); 
     } 
} 

아래와 같은 일이 사람이 나를 도울 수있다? 왜 데이터베이스가 롤백을 삽입하지 않습니까? DAO를 호출하기위한 방법으로 우리는 봄-TX 버전 4.2.4.RELEASE을 사용하고 트랜잭션이 @Transactional 주석이 rollbackFor 속성을 가져야한다 롤백하려면 우리의 응용 프로그램은 웹 스피어 8.5

+0

실제 dao impl과 서비스를 게시하십시오. 앱 구성 및 사용중인 데이터베이스에 대해 설명하십시오. –

답변

1

에서 실행되고 있습니다. @Transactional 어노테이션 오버 클래스를 사용할 수있다.

@Override 
@Transactional(rollbackFor = Exception.class, readOnly = false) 
public void doSomething() throws SomeException { 

    //dao calls (database insert) 
    //ldap dao call (ldap insert) 
} 
1

RuntimeException이 발생하면 기본적으로 스프링 트랜잭션이 롤백됩니다. SomeException이 확인 된 예외라면, 스프링이 발생할 때 롤백하도록 명시 적으로 지시해야합니다. @ saurav-saha의 대답을 참조하십시오. 일반적인 접근법은 검사 된 예외를 사용하지 않는 것입니다. Spring의 철학은 항상 RuntimeException을 사용하고 메소드의 클라이언트에 대해 어떤 가정도하지 않는 것입니다.

반면에 SomeException이 실제로 RuntimeException 인 경우 TransactionManager을 설정하지 않았을 가능성이 큽니다. 이 경우인지 알려면 메서드에 중단 점을 설정하고 호출 스택에서 org.springframework.transaction.interceptor.TransactionInterceptor을 찾습니다. 거기에 없으면 활성화 된 트랜잭션이 없으므로 트랜잭션 관리자를 구성해야합니다.

관련 문제