1. 문제 상황
Spring Batch에서 AWS Aurora MariaDB를 사용하고 있으며, autocommit=false
로 설정된 상태에서 작업 중 Pod 또는 Node가 강제 종료되면 미처리된 데이터가 자동으로 롤백될까, 아니면 락이 걸린 상태로 남아 있을까?
2. Aurora MariaDB의 트랜잭션 롤백 동작
Aurora MariaDB는 클라이언트 세션이 비정상적으로 종료되면 해당 세션의 트랜잭션을 자동으로 롤백한다.
즉, 다음과 같은 상황에서는 트랜잭션이 자동으로 롤백된다.
- Spring Batch 실행 중 Pod 또는 Node가 강제 종료됨
- DB 서버에서 해당 세션이 끊어짐을 감지
- 트랜잭션이 열린 상태에서 세션이 종료되었으므로 자동 롤백 발생
즉, 오토커밋이 비활성화된 상태라도 명시적인 COMMIT
이 호출되지 않았다면, 트랜잭션은 자동으로 롤백된다.
3. 예외적인 경우 – 트랜잭션 록(Lock)이 유지될 가능성
일반적으로 Aurora MariaDB는 세션이 종료되면 롤백을 수행하여 락이 해제되지만, 다음과 같은 특수한 경우에는 락이 일정 시간 유지될 수 있다.
네트워크 장애 발생 시
- Aurora가 세션 종료를 즉시 감지하지 못하는 경우
Deadlock 상황
- 특정 트랜잭션이 대기 상태가 되어 다른 트랜잭션이 영향을 받을 경우
Aurora Failover가 발생하는 경우
- Primary DB 장애로 인해 Failover가 진행되면서 기존 트랜잭션이 종료되지 못하는 경우
4. 해결 방법 및 권장 조치
이러한 문제를 방지하려면, 다음과 같은 조치를 취하는 것이 좋다.
세션 종료 시 트랜잭션 롤백 확인
SHOW ENGINE INNODB STATUS;
를 실행하여 트랜잭션 상태 점검
wait_timeout
및 interactive_timeout
조정
- 세션이 즉시 종료될 수 있도록
wait_timeout
,interactive_timeout
값을 조정
Aurora DB 강제 Failover 테스트 수행
- 장애 발생 시 트랜잭션 롤백이 정상적으로 수행되는지 확인
Spring Batch 트랜잭션 매니저 설정 확인
JdbcTransactionManager
또는DataSourceTransactionManager
가 정상 동작하는지 확인
5. 결론
Spring Batch가 autocommit=false
상태에서 실행 중 Pod 또는 Node가 강제 종료되면, Aurora MariaDB는 세션 종료를 감지하여 자동으로 롤백을 수행한다.
따라서 대부분의 경우 락이 유지되지 않지만, 네트워크 장애, Deadlock, Aurora Failover 등의 예외적인 경우를 대비해 적절한 트랜잭션 및 타임아웃 설정을 점검하는 것이 중요하다.