Amazon Aurora MySQL의 트랜잭션 제한 시간
aurora_transaction_timeout 파라미터는 트랜잭션의 최대 지속 기간을 설정합니다. 이 파라미터를 사용하면 장시간 실행되는 트랜잭션(활성 또는 유휴)이 InnoDB 삭제
파라미터 세부 정보
aurora_transaction_timeout 파라미터는 읽기 전용 트랜잭션을 포함하여 지정된 기간보다 오래 지속되는 모든 InnoDB 트랜잭션을 종료합니다. 초 단위로 값을 지정합니다. 값이 0(기본값)이면 제한 시간이 비활성화됩니다.
다음 표에는 파라미터 세부 정보가 요약되어 있습니다.
| 속성 | 값 |
|---|---|
| 이름 | aurora_transaction_timeout |
| 범위 | 세션, 글로벌 |
| 기본값 | 0(비활성화됨) |
| 단위 | 초 |
| 동적 | 예, 새 InnoDB 트랜잭션에만 적용 |
클러스터, 인스턴스 또는 세션 수준에서 aurora_transaction_timeout 파라미터를 설정할 수 있습니다. 파라미터 그룹 작업에 대한 자세한 내용은 Amazon Aurora의 파라미터 그룹 섹션을 참조하세요.
제한 시간 초과 동작
aurora_transaction_timeout 파라미터는 읽기 전용 트랜잭션을 포함하여 DML 문을 실행하는 InnoDB 트랜잭션에 적용됩니다. CREATE TABLE .. AS SELECT(CTAS) 및 LOAD DATA를 제외한 모든 암시적 커밋 문
제한 시간이 만료되면 트랜잭션 상태에 따라 다음과 같은 결과가 나타납니다.
-
트랜잭션에 활성 쿼리가 있는 경우 해당 쿼리가 중단되고 트랜잭션이 롤백됩니다. 연결은 계속 사용할 수 있습니다.
-
활성 쿼리가 없는 경우(즉, 트랜잭션이 유휴 상태인 경우) 연결이 종료됩니다.
예제
다음 예제는 다양한 트랜잭션 시나리오에서 타이머가 시작되는 시기를 보여줍니다.
명시적 트랜잭션
BEGIN; -- Does NOT start InnoDB transaction. No timer. SELECT * FROM t1; -- Starts InnoDB transaction. Timer starts HERE (at statement 2).
타이머가 문 2(첫 번째 InnoDB 문)에서 시작됩니다.
autocommit=0
SET SESSION autocommit=0; -- No transaction yet SELECT * FROM t1; -- Starts InnoDB transaction. Timer starts HERE. INSERT INTO t1 ...; -- Same transaction, timer still running from step 2.
타이머가 문 2(자동 커밋 비활성화 후 첫 번째 InnoDB 문)에서 시작됩니다.
저장 프로시저
저장 프로시저는 호출자의 트랜잭션 컨텍스트 내에서 실행됩니다. 호출자에게 이미 활성 InnoDB 트랜잭션이 있는 경우 타이머는 프로시저 직접 호출 전에 이미 시작된 상태입니다. 프로시저가 InnoDB에 처음으로 접근하는 경우 타이머는 프로시저 내의 첫 번째 InnoDB 문에서 시작됩니다.
BEGIN; CALL my_proc(); -- If my_proc() does SELECT/INSERT, timer starts at that first InnoDB statement inside the proc
주요 참고 사항
-
제한 시간은 트랜잭션 시작 시점에 캡처됨 – 제한 시간 값은 첫 번째 InnoDB 문이 실행될 때 캡처됩니다. 트랜잭션 도중에
aurora_transaction_timeout을 변경하면 현재 트랜잭션이 아닌 다음 트랜잭션에 적용됩니다. 경고는 발생하지 않습니다. -
XA PREPARED 트랜잭션 제외 – 준비된 트랜잭션에는
aurora_transaction_timeout이 적용되지 않습니다. -
쓰기 전달 세션에는 트랜잭션 제한 시간이 적용되지 않음 – 쓰기 전달이 활성화된 경우 전달된 문이 포함된 문 또는 트랜잭션은
aurora_transaction_timeout의 적용을 받지 않습니다. 동일 세션에서 전달된 문이 포함되지 않은 후속 트랜잭션에는 평소와 같이 제한 시간이 적용됩니다. 전달된 트랜잭션의 유휴 제한 시간을 제어하려는 경우aurora_fwd_writer_idle_timeout파라미터를 사용할 수 있습니다. 자세한 내용은 Aurora MySQL에서 쓰기 전달에 대한 구성 파라미터 섹션을 참조하세요. -
높은 제한 시간 값을 사용할 때는 주의 – 장시간 실행되는 트랜잭션이 롤백되는 경우, 롤백이 원래 데이터 변경 작업보다 몇 배 더 오래 걸릴 수 있습니다. 서버 시작 시 롤백이 다시 시작되므로 데이터베이스 프로세스를 종료하는 것은 도움이 되지 않습니다. 워크로드 요구 사항과 롤백 비용의 균형을 맞추는 제한 시간 값을 선택합니다. 자세한 내용은 MySQL 설명서에서 InnoDB 트랜잭션 관리 최적화
를 참조하세요.
클라이언트 오류
활성 쿼리가 있는 트랜잭션이 제한 시간을 초과하면 클라이언트에 다음과 같은 오류가 수신됩니다.
ERROR 63952 (40001): Transaction exceeded maximum allowed duration of <N> seconds and was rolled back. See aurora_transaction_timeout for configuring this behavior.
유휴 트랜잭션이 제한 시간을 초과하면 후속 쿼리에서 MySQL “server gone away” 오류와 동일한 오류가 수신됩니다. 자세한 내용은 MySQL 설명서에서 MySQL server has gone away
오류 로그
트랜잭션 시간 초과가 발생하면 데이터베이스 오류 로그에 정보 메시지가 기록됩니다.
[Note] Transaction breached timeout threshold and will be rolled back, if still in progress. If idle, the connection will be aborted. Check response for confirmation. connection_id: 4821, trx_id: 28193, user: app_user, timeout: 5 seconds, duration: 7 seconds
참고
이 로그 메시지는 진단 목적으로만 사용됩니다. 클라이언트 응답을 트랜잭션 시간 초과의 최종 지표로 삼으세요.
트랜잭션 시간 초과 모니터링
DB 인스턴스가 다시 시작된 이후 시간 초과된 트랜잭션 수를 추적하려면 Aurora_transaction_timeouts 상태 변수를 사용합니다.
SHOW GLOBAL STATUS LIKE 'Aurora_transaction_timeouts';
performance_schema가 활성화되면 시간 초과 오류(ER_AURORA_TRANSACTION_TIMEOUT_ERROR)가 performance_schema.events_errors_summary_global_by_error 및 관련 테이블에서도 추적됩니다. 활성 트랜잭션 시간 초과만 이 카운터를 증가시키며, 유휴 트랜잭션 시간 초과는 ER_AURORA_TRANSACTION_TIMEOUT_ERROR 오류를 발생시키지 않고 연결을 종료합니다.
다른 시간 초과와의 상호 작용
aurora_transaction_timeout는 기존 시간 초과 파라미터와 함께 작동합니다. 트랜잭션이 구성된 aurora_transaction_timeout보다 오래 열려 있으면 다른 시간 초과 설정에 관계없이 종료됩니다. 다른 시간 초과가 트랜잭션을 롤백하는지 여부는 해당 구현 방식에 따라 달라집니다. 이러한 파라미터에 대한 자세한 내용은 MySQL 설명서를 참조하세요.