2012-06-24 1 views
1

Informix IDS 11.50에서 교착 상태를 강제하는 방법을 찾고 있습니다.Informix - 단일 테이블을 포함하는 교착 상태 시나리오

  • 하나 개의 테이블 관련,
  • 격리 수준 :이 솔루션은 다음과 같은 조건을 충족해야 COMMITTED READ,
  • ROW 수준의 잠금,
  • 두 스레드하지만, 하나는 (행에 액세스 할 수의) 다른 하나에 의해 수정. 잠금 모드로

    CREATE TABLE t1 
    (
        id SERIAL PRIMARY KEY, 
        name CHAR(20) 
    ) 
    LOCK MODE ROW; 
    
    CREATE INDEX idx_name on t1 (name); 
    INSERT INTO t1 (name) VALUES ('A'); 
    INSERT INTO t1 (name) VALUES ('B'); 
    

    2에 별도의 dbaccess를 콘솔 (다음과 같이 t1 만들고 채워집니다

    테이블 :

나는 모든 조건하지만 마지막 하나를 만족하는 솔루션을 함께했다 15 초 동안 대기하도록 설정) 다음 명령을 실행합니다.

dbaccess #1: BEGIN; 
dbaccess #1: UPDATE t1 SET name = name WHERE name = 'A'; 
dbaccess #2: BEGIN; 
dbaccess #2: UPDATE t1 SET name = name WHERE name = 'B'; 
dbaccess #1: SELECT * FROM t1; 
dbaccess #2: SELECT * FROM t1; -- 143: ISAM error: deadlock detected 

이러한 스레드는 교착 상태입니다 SELECT가 다른 스레드가 커밋하기를 기다리고 있기 때문입니다. 이 해결책은 두 스레드가 네 번째 조건을 위반하는 다른 스레드에 의해 업데이트 된 행을 선택하는 것은 좋지 않습니다. 누구든지이 솔루션을 개선하거나 모든 기준을 충족시키는 다른 방법을 제공 할 수있는 방법을 생각할 수 있습니까?

+0

위의 문제를 내 informix db로 복제 할 수 없습니다. –

답변

1

네 번째 조건은 교착 상태가 발생할 가능성을 거부합니다.

교착 상태는 두 스레드가 (다른 스레드가 원하는 자원을 보유하면서) 자원을 해제하기 위해 대기 중일 때 발생하지만 네 번째 조건은 해당 가능성을 배제합니다.

+0

고마워, 그건 완벽하게 이해가된다. – AtomHeartFather