2016-07-15 3 views
0

우리는 PostahreSQL 데이터베이스에 행을 삽입합니다. 트랜잭션은 1000 행을 사용하며, Pentaho 스푼 변환시 커밋합니다.다른 테이블을 차단하는 삽입물 삽입

테이블에는 외래 키와 같은 몇 가지 필드/제약 조건이 있습니다. 즉 고객 테이블과 유사 항목에 customer_id가 있어야합니다. 우리는 교착 상태 오류가 수시로

...

ERROR: se ha detectado un deadlock 
    Detail: El proceso 29996 espera ShareLock en transacción 6643574; bloqueado por proceso 31826. 
El proceso 31826 espera ShareLock en transacción 6643573; bloqueado por proceso 29996. 
    Hint: Vea el registro del servidor para obtener detalles de las consultas. 
    Where: sentencia SQL: «SELECT 1 FROM ONLY "public"."customer_table" x WHERE "id" OPERATOR(pg_catalog.=) $1 FOR SHARE OF x» 

우리는 우리의 삽입은 다른 테이블을 차단하는 기대하지 않았다. 내가 상상할 수있는 유일한 이유는 고객 기록이 트랜잭션 경과 시간 동안 삭제되지 않는다는 것입니다.

고객 기록이 삭제되지 않는다는 점에서 (사용자가 할 수있는 방법이 없음) 공유 잠금을 피할 수있는 방법이 있습니까? THER가 아닌 경우에도

, 나는 무엇을 : 무슨 일이 일어나고에 어떤 빛을 부탁드립니다

Thks

답변

0

INSERT 아무도 수정 그렇지 않으면 삭제하거나 할 수 있는지 확인하기 위해 customer_table의 행을 고정해야합니다 id 열을 삽입 트랜잭션이 완료되고 모든 행에 대해 새 행이 표시 될 때까지 가져옵니다.

INSERT을 차단하는 에있는 모든 UPDATE 또는 DELETE 일 수 있습니다.

나는 PostgreSQL을 9.3로 업그레이드하는 것이 좋습니다 이상, 다음 INSERT는 부모 행에 SHARE 잠금을하지 않지만 customer_tableUPDATE들과 충돌되지 않습니다 FOR KEY SHARE 잠금 장치는 그 고유 제한 조건을 가진 모든 열 영향을주지 않습니다 . 그러면 동시성이 향상되고 사용자가 겪는 교착 상태를 피할 수 있습니다.