2011-12-30 2 views
0

간단한 스프링 애플리케이션을 작성하여 Spring 선언적 트랜잭션의 기본 사항을 테스트했다. 규칙에 따라 선언적 트랜잭션은 RuntimeException의 경우 롤백해야합니다. 하지만 제 경우에는 굴러 가지 않았습니다.스프링 선언 트랜잭션이 롤백되지 않음

홈페이지 테스트 클래스 코드를

public class SpringOraTest { 
public static void main(String[] args) { 
    ApplicationContext aplctx= new  
FileSystemXmlApplicationContext("src\\config\\SpringConfigForOra.xml"); 

    //Call to test Declarative Transaction with Annotation 
TrxHandleAnnotated prxyobj=((TrxHandleAnnotated)aplctx.getBean("dbCommandAnnotated")); 
prxyobj.doTask(); 
} 
} 

TrxHandleAnnotated 코드했다 클래스가 있습니다 -

@Transactional 
public class TrxHandleAnnotated 
public void doTask(){ 
ApplicationContext aplctx= new 
FileSystemXmlApplicationContext("src\\config\\SpringConfigForOra.xml"); 
JdbcTemplate jdbcTemplate= (JdbcTemplate)aplctx.getBean("jdbcTemplate"); 

jdbcTemplate.update("insert into kau_emp values(4,'forthmulga')"); 

throw new RuntimeException(); 
} 

을 및 구성 XML의 구성이 필요했다.

예외가 발생하면 해당 트랜잭션이 롤백 될 것으로 예상됩니다. 그러나 그것은 롤백되지 않았고 기록은 DB에게 커밋되기 시작했다.

인터넷에서 긴 검색을 한 후에도 왜 롤백되지 않았는지 이해할 수 없었습니다.

나중에 doTask() 코드에서 다시 한 번 컨텍스트를 만들고 JdbcTemplate 인스턴스를 새로운 컨텍스트 밖으로 가져온 것을 깨달았습니다. 이것이 문제의 근본 원인이었습니다.

코드를 변경하여 두 클래스 모두 일부 컨텍스트를 사용합니다. 그리고 그것은 효과가있었습니다 !!!

public class SpringOraTest { 
public static ApplicationContext aplctx; 
public static void main(String[] args) { 
    aplctx= new FileSystemXmlApplicationContext("src\\config\\SpringConfigForOra.xml"); 

    //Call to test Declarative Transaction with Annotation 
    TrxHandleAnnotated prxyobj=  
((TrxHandleAnnotated)aplctx.getBean("dbCommandAnnotated")); 
prxyobj.doTask(); 
} 

@Transactional 
public class TrxHandleAnnotated 
public void doTask(){ 

JdbcTemplate jdbcTemplate=(JdbcTemplate)SpringOraTest.aplctx.getBean("jdbcTemplate"); 
jdbcTemplate.update("insert into kau_emp values(4,'forthmulga')"); 

throw new RuntimeException(); 
} 

그렇지 않은 경우를 제외하고는 전체 응용 프로그램에서 하나의 컨텍스트 개체 만 사용해야한다는 것을 나에게 알게되었습니다.

이것은 봄철 개업 의사들에게 들리 겠지만 나 같은 스프링 초심자는 그런 어리석은 실수를 할 수 있습니다. 그래서 그것을 공유하는 생각.

수동으로 JdbcTemplate을 생성하는 대신이 특별한 경우를 멤버 변수로 선언하고 setter injection을 사용하는 것이 좋습니다.

+0

발견을 공유하려면 블로그를 열어야합니다. StackOverflow는 질문을하기위한 것입니다. –

답변

-1

@TransactionConfiguration("name",ROLLBACK); //check syntax을 @Transactional 뒤에 사용하여 TrxHandleAnnotated을 선언하십시오. @Transcational 및 그 사용법에 대한 자세한 내용은 this link을 참조하십시오.

관련 문제