Transaction 처리로 인한 data rollback issue

이동욱·2025년 2월 25일
0

TroubleShooting

목록 보기
8/9

Transaction 처리로 인한 data rollback issue

1. 개요


특정 api의 service 비즈니스 로직을 수행할 때 exception이 발생했는데 이때 dummy data가 다른 화면에서 조회되는 현상이 있었다.

2. 분석


exception이 발생 했던 service 로직의 transaction 처리가 제대로 되지 않아 data rollback이 기대했던 방향으로 동작하지 않아 생기는 issue 였다.

  • 해당 service 함수의 대략적인 transaction 구조는 다음과 같다

    • 아래 B, C, D의 함수에도 모두 @Transactional annotation이 설정되어 있다.
    • C 함수는 전자정부프레임워크의 시퀀스 생성 함수를 별도로 만든 함수이다.
    @Transactional
    public void funcA() {
    	funcB(); // insert
       
       ... 중략
       
       funcC(); // insert
       
       ... 중략
       
       funcD(); // insert
    }
  • 위 상황에서 어느 곳에서든 exception이 발생하면 모든 함수의 Propagation은 default인 REQUIRED로 동작하기 때문에 모든 data가 rollback이 되어야 정상이다.

  • 하지만 자꾸 중간 중간 insert된 data가 rollback 되지 않고 commit이 되어 db에 반영이 되길래 아래와 같이 로그 관련 설정 후 확인 해봤다.

application.yml
jdbc.audit: on

3. 원인


확인 해본 결과 전자정부 프레임워크 시퀀스 생성 함수인 funcB가 같은 transaction 내에서 commit을 하고 있었기 때문에 중간 중간 insert 된 data들이 db에 반영이 되었던 것이다.

4. 해결


따라서 funcB 함수의 transaction을 별도의 transaction으로 수행 시키기 위해서 @Transactional(propagation = Propagation.REQUIRES_NEW) 설정을 추가했다.

5. 고찰


EgovTableIdGnrService.class의 transcationTemplate을 확인해봤을 땐

this.transactionTemplate.setPropagationBehaviorName("PROPAGATION_REQUIRES_NEW");

위와 같이 REQUIRES_NEW 설정이 되어 있는 것을 확인해서 당연히 별도의 transaction을 만들어 수행할 줄 알았는데 실제 로그 상으로는 비즈니스 로직의 transaction을 따라 수행이 되고 있어서 파악하기 힘들었다.

좀 더 파악하기론 db config 쪽을 보면 둘 다 같은 datasource 내에서 transaction manager를 만들어 사용하는데 그렇다면 서로 다른 transaction manager니까 더더욱 별도의 transaction으로 관리가 되어야 할 것 같은데 이 부분은 좀 더 확인이 필요할 것 같다.

profile
lduk 웹 개발자(back)

0개의 댓글