Web/SpringBoot

Spring Transaction rollback 이 안됨

벨포트조던 2019. 11. 8.
반응형

내 경우와 비슷한게 있어서 다른 블로그 글을 첨부한다.

 

추가적으로 내 코드에는 

@Transactional 에 옵션을 달지 않았다. 필요하면 옵션 검색해서 달기 바란다.

 

해결 - try...catch 문에서 Exception을 catch 하고 증발시켜버려서 Spring 이 예외를 감지하지 못한거였다.

https://sbs20011.tistory.com/entry/Spring-Transaction-%EC%9D%B4-%EC%99%9C-%EC%95%88%EB%A8%B9%EC%A7%80

 

 

기존 소스

@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor={Exception.class})

public int insertAndUpdate() {

    try {

        insert();

        update();

        return 1;

    } catch (Exception e) {

        e.printStackTrace();

        return 0;

    }

}

 

public void insert() throws Exception {

    // db insert

}

 

public void update() throws Exception {

    throw new Exception();

}

 

 

insertAndUpdate()는 항상 새로운 트랜잭션을 가져야하기 때문에 propagation=Propagation.REQUIRED_NEW 로 설정

Exception.class 예외가 발생했을 때 rollback 하기 위해서 rollbackFor={Exception.class} 로 설정

update() 메소드에서 강제로 Exception 발생을 시켰는데 insert() 메소드를 통해 DB에 등록된 값이 rollback이 되지 않는 것....

 

try...catch 문에서 Exception을 catch 하고 증발시켜버려서 Spring 이 예외를 감지하지 못한거였다.

 

수정 소스

 

@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor={Exception.class})

public int insertAndUpdate() throws Exception {

    try {

        insert();

        update();

        return 1;

    } catch (Exception e) {

        e.printStackTrace();

        throw new Exception(); // Spring에 던져준다

    }

}

 

public void insert() throws Exception {

    // db insert

}

 

public void update() throws Exception {

    throw new Exception();

}



출처: https://sbs20011.tistory.com/entry/Spring-Transaction-이-왜-안먹지 [STRA]

출처: https://sbs20011.tistory.com/entry/Spring-Transaction-이-왜-안먹지 [STRA]

 

[2018-08-29] Spring Transaction rollback 이 안됨

기존 소스 @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor={Exception.class}) public int insertAndUpdate() { try { insert(); update(); return 1; } catch (Exception e) { e.printStac..

sbs20011.tistory.com

잘 작동한다

 

참고 : https://stackoverflow.com/questions/16421508/how-to-rollback-spring-transaction-when-an-exception-is-thrown

 

-------------- 2019-04-17 추가

위 부분 문제가 되기 전에 삽질을 했던 것이 생각나서 추가함.

 

servlet-context.xml 에 component-scan 을 package 전체를 잡아놔서 안된 것도 있었다.


<!-- servlet-context.xml -->

<context:component-scan base-package="com.tistory.sbs20011" />

 

 

 

servlet context에는 controller 만 추가하고, 그 외는 application context에 추가한다

 

 


<!-- servlet-context.xml -->

<context:component-scan base-package="com.tistory.sbs20011.controller" />

 

<!-- root-context.xml -->

<context:component-scan base-package="com.tistory.sbs20011.biz" />

<context:component-scan base-package="com.tistory.sbs20011.dao" />

<context:component-scan base-package="com.tistory.sbs20011.service" />



 

[2018-08-29] Spring Transaction rollback 이 안됨

기존 소스 @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor={Exception.class}) public int insertAndUpdate() { try { insert(); update(); return 1; } catch (Exception e) { e.printStac..

sbs20011.tistory.com


출처: https://sbs20011.tistory.com/entry/Spring-Transaction-이-왜-안먹지 [STRA]

반응형

댓글