Skip to end of metadata
Go to start of metadata

  




개요 


변경 트랜잭션 수행 시 발생할 수 있는 에러 메시지에 관해 수행합니다.



 

버전  


 이 에러 메시지는 Altibase 모든 버전에서 발생할 수 있으나 Altibase 서버 버전에 따라 에러 메시지에 차이가 있습니다.
 

  • ALTIBASE HDB 4.3.9 ~ 5.3.3
    ERR-11075 (  69749) The transaction exceeds lock timeout specified by user. 

  • ALTIBASE HDB 5.5.1 이상
    ERR-11075 (  69749) The transaction has exceeded the lock timeout specified by the user. 




현상


다음은 이 에러 메시지가 발생하는 주로 발생하는 몇 가지 현상에 대한 예입니다.

1. DDL 문장 수행 시 발생하는 경우

세션-1

세션-2

DDL(truncate문) 수행 시 에러 발생

autocommit off;  
update test_emp_tbl set emp_no = 10;                             
 
update 수행 중...truncate table test_emp_tbl;                         
[ERR-11075 : The transaction has exceeded the lock timeout specified by the user.]

 

2. 메모리 테이블에 변경 트랜잭션 수행 시 발생하는 경우

세션-1

세션-2

iSQL> autocommit off;
Set autocommit off success.


iSQL> update tb_test1 set c10=sysdate where c1=1;
1 row updated.

 

 

iSQL> select count(*) from tb_test1;
COUNT                
-----------------------
1000000              
1 row selected.


iSQL> alter session set TRX_UPDATE_MAX_LOGSIZE=100000000;
Alter success.

iSQL> alter system set LOCK_ESCALATION_MEMORY_SIZE=100000000;
Alter success.


iSQL> update tb_test1 set c10=sysdate;
[ERR-11075 : The transaction has exceeded the lock timeout specified by the user.]


3. SELECT FOR UPDATE WAIT N (또는 NOWAIT) 을 사용한 SELECT 문장 수행 시 발생하는 경우

세션-1세션-2
autocommit off; 
update test_emp_tbl set emp_no = 10; 
 
 select * from test_emp_tbl for update wait 1; 
[ERR-11075 : The transaction has exceeded the lock timeout specified by the user.]
 select * from test_emp_tbl for update nowait;
[ERR-11075 : The transaction has exceeded the lock timeout specified by the user.]  

 

4. 이중화 환경에서 altibase_rp.log 에 발생하는 경우

이중화 환경에서 $ALTIBASE_HOME/trc/altibase_rp.log 에서 에러가 발생할 수 있습니다.

 


 

원인 


이 에러는 객체에 락을 획득하려는데 이미객체에 락이 걸려있어 락을 획득할 수 없을 때 발생합니다.


1. DDL 문장 수행 시 발생하는 경우

DDL 구문 수행 시 대상 테이블에 이미 다른 트랜잭션에 의해 LOCK 이 걸려있는 경우 DDL 수행을 위한 LOCK 을 바로 획득하지 못해 DDL 수행이 실패할 수 있습니다. 
 

이것은 알티베이스 서버 프로퍼티 DDL_LOCK_TIMEOUT 설정에 따라 다르게 동작할 수 있습니다. 

  • DDL_LOCK_TIMEOUT = 0 (기본값)
    LOCK 을 획득하지 못하면 바로 실패 처리합니다.

  • DDL_LOCK_TIMEOUT = -1
    LOCK 을 획득하지 못할 경우 무한정 대기합니다. 
  • DDL_LOCK_TIMEOUT = 초
    DDL 수행 시 LOCK 을 획득하지 못하면 지정한 시간만큼 대기 후 다시 시도합니다. 
    다시 시도할 때도 LOCK 을 획득하지 못하면 실패하게 됩니다. 

  

 2. 메모리 테이블에 변경 트랜잭션 수행 시 발생하는 경우

 메모리 테이블에 수행한 변경 트랜잭션으로 트랜잭션 로그 파일의 크기가 LOCK_ESCALATION_MEMORY_SIZE 프로퍼티 설정값를 초과하면 레코드 레벨 IX_LOCK에서 테이블 레벨 X_LOCK 으로 전환합니다.  이 때 다른 세션에서 해당 테이블의 다른 레코드에 IX_LOCK이 걸려 있다면 테이블 레벨 X_LOCK 획득이 실패하여 에러가 발생 할 수 있습니다.

 

3. SELECT FOR UPDATE WAIT N (또는 NOWAIT)  수행 시

SELECT FOR UPDATE WAIT N 혹은 SELECT FOR UPDATE NOWAIT 을 사용한 SELECT 문장은 해당 레코드에 대해 락을 걸고 수행합니다.

그런데 동일 테이블에 다른 세션에서 먼저이 걸려있는 경우 락을 획득하지 못해 에러가 발생할 수 있습니다.   
  

4. 이중화 환경에서 altibase_rp.log 에 발생하는 경우

이중화 반영해야 할 트랜잭션이 로컬 서버의 트랜잭션이 끝나기를 기다리는 경우.

Active Server

Standby Server

alter replication rep1 start;

 

 

iSQL>  autocommit off;
Set autocommit off success.
iSQL> insert into tb_test1(c1,c10) values(1000001, sysdate);
1 row inserted.

iSQL> autocommit off;
Set autocommit off success.
iSQL> insert into tb_test1(c1,c10) values(1000001, sysdate);
1 row inserted.

 

Active Server의 insert문이 Standby Server에 반영해야하는데 Standby Server의 로컬 트랜잭션에 의해 이중화 트랜잭션이 반영될 수 없을 때 altibase_rp.log 에 에러 메시지가 기록됩니다.

이 현상은 REPLICATION_LOCK_TIMEOUT 프로퍼티 값에 영향을 받습니다.

이중화 로그를 반영하는 서버(위 예제에서는 Standby Server)에서 REPLICATION_LOCK_TIMEOUT(초) 시간 안에 LOCK을 획득하지 못하면 위 에러가 발생하고 반영하려던 이중화 트랜잭션은 실패합니다.



 

조치


  • DDL 수행 시 발생하는 경우
    일반적으로 DDL 수행은 가장 idle한 시간에 수행할 것을 권장합니다.
    서비스 중지 상태가 아니라면 순간적으로 X LOCK 획득에 실패할 수 있으므로 에러가 발생하면 DDL을 여러번  반복 수행해봅니다.
    동일 에러가 계속 발생한다면 대상 테이블이 busy한 상태인지 또는 long run query(수행시간이 오래 걸리는 쿼리 또는 commit 하지 않은 쿼리)가 있는지 확인해 보시고 조치 후 다시 DDL을 수행하시기 바랍니다.

  • 메모리에 변경 트랜잭션 수행 시 발생하는 경우
    LOCK_ESCALATION_MEMORY_SIZE 에 의해 위 에러가 발생했다면 대량의 변경 트랜잭션의 가능성이 큽니다.   
    근본적인 해결 방법은 대량의 변경 연산을 하지 않도록 주의해야합니다.   
    조건절 및 limit절 등을 이용하여 변경 대상 레코드 수를 적게 하여, 여러 번에 나누어서 변경 트랜잭션을 수행하기를 권장합니다.

  • SELECT FOR UPDATE문 수행 시 발생하는 경우
    SELECT FOR UPDATE문을 성공할 때까지 반복 시도합니다.
    커밋되지 않은 트랜잭션을 찾아서 커밋 또는 롤백합니다.
    WAIT 옵션의 시간을 늘립니다.

  • 이중화 환경에서 발생하는 경우
    이중화 설계 시 동일 레코드에 대해 양 서버에서 동시에 변경하지 않도록 고려되어야 합니다.  
    본 에러 발생 시 양 서버의 데이터 정합성에 문제가 될 수 있으니 데이터를 확인해야 합니다.  
     


참고



  • No labels