2012-11-14 3 views
1

Spring에서 트랜잭션을 처리하는 데 문제가 있습니다. 필자는 일정 횟수의 반복 작업을 수행하고 매번 Oracle 데이터베이스에 레코드를 삽입하는 웹 서비스를 제공합니다. 내 서비스의 삽입 메소드를 @Transactional로 표시했다. 왜냐하면 삽입이 실패 할 때마다 (RuntimeException 다음에, 즉 삽입 될 null 객체의 경우) 롤백하기를 원하기 때문이다.Spring 컨텍스트에 의해 인스턴스화되지 않은 클래스에서 Spring 트랜잭션이 롤백되지 않습니다.

문제점은 Java로 서비스를 테스트 할 때 Spring 애플리케이션 컨텍스트를 통해 서비스를 인스턴스화하는 주에서 evertything이 제대로 작동한다는 것입니다 (모든 레코드가 롤백 됨). 대신 웹 서비스를 soapUI로 테스트하면 로컬 서버에 배포 한 후 @Transactional 주석이 보이지 않는 것입니다.

내 코드를보고합니다. 여기 내 주요의

@Service 
public class MyService{ 

     @Transactional 
     public void insert(List<DAO> l) { 

       for(DAO item : l) { 
       //Insert item into the DB 
       //and throw a RunTimeException in case of failure (i.e.,item null) 
       } 
     } 
} 

:

여기 내 서비스의 나는 Spring 애플리케이션 컨텍스트와 웹 서비스를 인스턴스화 할 때

public class TestMain{ 

    public static void main(String[] args) { 

     ApplicationContext ac = new FileSystemXmlApplicationContext(SPRING_CONTEXT_XML_PATH); 

     MyService service = ac.getBean(MyService .class); 

     List<DAO> l; //Suppose it is initialized  
     service.insert(l); //Rollback working if RuntimeException is thrown  
} 

}

내가 말했듯이, 위의 코드가 작동, 그러나 서버에 전개 한 후에 soapUI를 통해 MyService를 호출하면 실제로 서비스가 수행되는 것이므로 @Transactional은 실행되지 않습니다.

누군가 내게이 동작을 설명 할 수 있습니까?

대단히 감사합니다.

+0

이 웹 서비스를 호출하는 SOAP 코드를 공유 할 수 있습니까? 끝점에서 'MyService'를 가져오고 호출하는 방법은 무엇입니까? –

답변

0

@Transactional 주석이 있으므로 insert 메서드가 호출 될 때마다 spring이 트랜잭션을 시작합니다. insert이 반환되면 트랜잭션이 커밋됩니다 (또는 예외가 발생하면 롤백됩니다). 스프링 타입 MyService의 빈을 생성 할 때

는,이 같은으로 insert 방법을 랩 :

EntityManager em = ...; // get EntityManager here 
EntityTransaction tx = null; 
try { 
    tx = em.getTransaction(); 
    tx.begin(); 

    // your insert method is called here. 

    tx.commit(); 
} catch (Exception e) { 
    if (tx != null && tx.isActive()) { 
     tx.rollback(); 
    } 
} 

soupUI가 @Transactional 주석을 처리하지 않습니다. 트랜잭션을 시작하고 직접 커밋/롤백해야합니다.

+0

답변 해 주셔서 감사합니다. 하지만 배포 된 서비스는 원격 클라이언트에 의해 호출되어야하며 (자바에서 메인 클래스의 서비스 클래스를 인스턴스화하지 않고) soapUI를 사용하면 서비스 로직을 테스트해야한다. 서비스를 호출하는 사람은 트랜잭션 주석이없는 경우와 동일한 동작을 얻습니다 (즉, 롤백이 실행되지 않음을 의미). – imby

관련 문제