트랜잭션 타임아웃

CUBRID는 잠금의 타임아웃 기능을 제공한다. 응용 프로그램은 잠금을 기다리는 최소한의 시간을 CUBRID에 알려줄 수 있는데, lock_timeout_in_secs 시스템 매개변수나 SET TRANSACTION 문을 통해 할 수 있다. 타임아웃 값이 주어지지 않으면 기본 값은 잠금이 허용되거나 트랜잭션이 교착 상태로 인해 롤백될 때까지 무한정 기다리는 것이다.

만약 명시된 시간 내에 잠금이 허용되지 않으면 잠금은 거부되고 연산의 수행은 취소된다. CUBRID는 잠금 타임아웃으로 인해 연산이 취소되었음을 알리는 에러를 반환한다.

명시된 타임아웃 값이 있는 트랜잭션이 교착 상태에 빠지게 되면 CUBRID는 롤백 대신 타임아웃으로 그 트랜잭션을 선택한다. 만약 교착 상태에 있는 여러 트랜잭션이 만료된 타임아웃 값을 가지고 있으면 CUBRID는 타임아웃 만료에 가장 가까운 것을 선택하려고 한다. 그러므로 타임아웃은 무한정 잠금을 기다리거나 트랜잭션이 시스템에 의해 롤백되는 것을 방지하는데 사용될 수 있다.

타임아웃 값 설정

아래는 SET TRANSACTION 문의 구문이다.

구문

SET TRANSACTION LOCK TIMEOUT timeout_spec [ ; ]
timeout_spec:
_ INFINITE
_ OFF
_ unsigned_integer
_ variable

만약 timeout_specINFINITE(기본 값)를 설정하면 트랜잭션은 잠금이 허용되거나 트랜잭션이 교착 상태로 인해 롤백될 때까지 무한정 기다린다. 만약 OFF로 설정되면 다른 트랜잭션이 호환되지 않는 잠금을 가지고 있을 때 잠금을 기다리지 않는다. 이 경우에 잠금은 거부되고 연산의 수행은 취소된다. 만약 잠금이 unsigned_integer로 명시된 시간(초 단위) 내에 허용되지 않으면 잠금은 거부되고 연산은 취소된다. variable을 이 문에 사용하면 트랜잭션은 이 변수에 저장된 값만큼의 시간 동안 잠금이 허용되길 기다린다. 만약 연산이 취소되면 CUBRID는 잠금 타임아웃으로 인해 연산이 취소되었음을 알리는 오류를 반환한다.

타임아웃 값 얻기

타임아웃 값을 설정하는 것 외에도 GET TRANSACTION 문을 이용하여 특정 트랜잭션에 설정된 타임아웃 값을 얻어올 수도 있다.

구문

GET TRANSACTION LOCK TIMEOUT [ { INTO | TO } variable ] [ ; ]

이 명령문은 타임아웃 매개변수의 값을 가져와 명시된 변수에 할당할 수 있다.

잠금 타임아웃 에러 메시지

잠금 요청이 차단 되었다가 타임아웃이 발생하면(CSQL에서 잠금이 차단 되었을 때 <Ctrl+C> 키를 누른 경우나, lock_timeout_in_secs 값이 –1이 아닌 트랜잭션이 lock_timeout_in_secs에 도달하는 경우 타임아웃이 발생한다) 잠금 요청을 차단시킨 다른 트랜잭션들의 정보가 에러로 출력된다. 트랜잭션들의 정보를 출력하려면 lock_timeout_message_type 시스템 인자를 수정하면 된다. 이 값은 0이 기본값이다. 1이면 차단시킨 트랜잭션들 중 하나의 정보만 출력되고, 2이면 차단시킨 모든 트랜잭션들의 정보가 다 출력된다.

다음은 격리수준을 SERIALIZABLE로 설정하고, lock_timeout_message_type의 값을 바꾸면서 테스트해 본 결과이다. lock_timeout_message_type 값을 변경하고 적용하려면 데이터베이스 서버를 재시작해야 한다.

 0일 경우 다음과 같은 에러 메시지가 출력된다.

ERROR: Your transaction (index 3, brightes@cdbs006.cub|15668) timed out waiting on    X_LOCK lock on instance 0|636|34 of class participant. You are waiting for user(s)  to finish.

1인 경우 다음과 같은 에러 메시지가 출력된다.

ERROR: Your transaction (index 3, brightes@cdbs006.cub|15668) timed out waiting on    X_LOCK lock on instance 0|636|34 of class participant. You are waiting for user(s) brightes@cdbs006.cub|15615 to finish.

2인 경우 다음과 같은 에러 메시지가 출력된다.

ERROR: Your transaction (index 3, brightes@cdbs006.cub|15668) timed out waiting on    X_LOCK lock on instance 0|636|34 of class participant. You are waiting for user(s) brightes@cdbs006.cub|15615, brightes@cdbs006.cub|15596 to finish.