내용 정정: 이전 글의 “Aurora MariaDB”는 서로 다른 엔진을 혼동한 표현입니다. Aurora는 MySQL·PostgreSQL 호환 엔진이며 RDS for MariaDB와 구분해야 합니다. 아래에서는 MySQL 계열 InnoDB의 락 대기와 롤백 범위를 설명합니다. 실제 운영 엔진·버전은 배포 환경에서 확인해야 합니다. AWS Aurora 공식 소개.
락을 기다리는 시간과 락을 보유하는 시간은 다릅니다
innodb_lock_wait_timeout은 다른 트랜잭션의 InnoDB 행 잠금을 기다리는 시간을 제한합니다. 락을 잡고 있는 모든 트랜잭션을 일정 시간 후 종료시키는 설정은 아닙니다. 타임아웃의 기본 동작은 대기하던 문장 롤백이므로, 이미 수행한 다른 문장까지 자동으로 모두 취소된다고 보면 안 됩니다.
엔진과 현재 설정부터 확인
SELECT VERSION(), @@version_comment;
SHOW VARIABLES LIKE 'innodb_lock_wait_timeout';
SHOW VARIABLES LIKE 'innodb_rollback_on_timeout';
SHOW ENGINE INNODB STATUS;
관리형 DB의 정확한 엔진·버전과 파라미터 그룹은 AWS 콘솔에서도 확인합니다. 진단 명령에 필요한 권한과 출력 민감정보를 확인하세요.
설정별 적용 범위
| 설정 | 역할 | 적용 시 확인 |
|---|---|---|
| innodb_lock_wait_timeout | InnoDB 행 잠금 대기 제한 | 값의 단위는 초. 현재 세션 실험과 운영 파라미터 변경을 구분 |
| innodb_rollback_on_timeout | 락 대기 타임아웃의 전체 트랜잭션 롤백 여부 | MySQL 8.0에서는 동적 변경 불가. 기존 SET GLOBAL 예시는 제거 |
| max_statement_time | MariaDB의 문장 실행 시간 제한 | Aurora MySQL에 같은 이름을 그대로 적용하지 않음 |
| wait_timeout | 비대화형 유휴 연결 종료 | 실행 중인 쿼리나 락 보유 시간을 직접 제한하지 않음 |
MySQL 8.0의 innodb_rollback_on_timeout은 서버 시작 옵션이며 SET GLOBAL로 즉시 바꾸는 변수가 아닙니다. Aurora·RDS에서는 해당 엔진의 파라미터 지원 여부와 재시작 필요성을 먼저 확인합니다. MySQL InnoDB 변수 설명.
비운영 DB에서 확인하는 순서
테스트 테이블을 준비해 세션 A가 한 행을 갱신하고 커밋하지 않은 상태를 만듭니다. 세션 B는 별도 행을 먼저 갱신한 뒤 A의 행을 갱신하도록 하여 락 대기를 재현합니다. B의 타임아웃 후 먼저 갱신한 행이 남는지 확인하면 문장 롤백과 전체 트랜잭션 롤백을 구분할 수 있습니다. 각 세션을 명시적으로 ROLLBACK하고 종료하세요. 이 글에는 해당 환경에서 실행한 실험 결과가 추가되지 않았습니다.
Spring 애플리케이션은 타임아웃 예외를 무시한 채 커밋하지 않도록 트랜잭션 경계를 확인해야 합니다. 롤백 완료 뒤 재시도하며, 중복 실행을 막을 업무 키와 재시도 한도를 함께 설계합니다.
Pod 종료 후 DB 세션과 롤백을 확인하는 방법은 Aurora MySQL·RDS MariaDB에서 Spring Batch 강제 종료 시 롤백 확인하기에서 이어집니다.
“Aurora MySQL·RDS MariaDB에서 락 대기 타임아웃과 트랜잭션 롤백 구분하기”의 하나의 댓글