간단한 스프링 애플리케이션을 작성하여 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을 사용하는 것이 좋습니다.
발견을 공유하려면 블로그를 열어야합니다. StackOverflow는 질문을하기위한 것입니다. –