2012-09-13 2 views
0

내 webapp에서 일부 쿼리는 3 분 (나는 알고 있습니다. 거대한 것 같습니다 ...). 같은 시간에 다른 사용자가 동일한 테이블에서 데이터를 업데이트하려고합니다. 업데이트 쿼리가 실행을 위해 선택 종료 대기 상태 인 것으로 보입니다.선택에 의해 잠김 업데이트

PostgreSQL의 표준 작동 방식입니까? 선택한 쿼리가 끝나기 전에 강제로 업데이트를 실행하는 방법이 있습니까?

감사합니다.

+3

기본적으로 PostgreSQL'select'는'update'를 막아서는 안됩니다. [MVVC] (http://www.postgresql.org/docs/8.4/interactive/mvcc-intro.html)를 참조하십시오. 명시 적 잠금 힌트를'select' 쿼리에서 사용합니까? – Andomar

+0

'select '에'for update' 절을 포함 시켰습니까? 아니면'update'를 실행하기 전에 명시적인 테이블 잠금을 했습니까? –

+0

해당 트랜잭션의 SELECT 부분이며, 그렇다면 다른 쿼리는 무엇입니까? –

답변

1

MVCC를 비활성화하여 문제가되지 않도록 할 수는 없습니다. MVCC는 행이 디스크에 저장되는 방식을 참조하고 낮은 잠금은 피할 수 있습니다.

PostgreSQL 잠금이 필요한시기와 방법을 이해할 때 MVCC를 이해해야합니다. 일반적으로 독자는 독자 또는 작가를 차단하지 않습니다. 그리고 드물게 작가는 독자를 차단하지 않습니다.

독자와 작성자는 일반적으로 문 또는 트랜잭션의 수명을 통해 비교적 안정적인 스냅 샷을 처리하여 서로를 차단할 수 있습니다 (정확한 안정성은 트랜잭션 수준에 따라 다름).

행 잠금은 여전히 ​​가능하지만 명시 적으로 요청해야합니다. SELECT ... FOR UPDATE은에 대해 선택된 행을 잠급니다. 따라서 가장 먼저 할 일은 SELECT 문에 for update 술어가 있는지 확인하고 확인하는 것입니다.

그런 경우가 아닌 경우, 격리 수준을 확인하고는 pg_locks 테이블을 확인하고 실제로 고정되는 내용을 참조 넘어

read committed 격리 수준에서 실행 해보십시오.

관련 문제