2014-03-31 5 views
0

다른 테이블에서 읽기 작업을 수행 할 수 없도록 잠금이 설정된 테이블에서 행을 읽으려고합니다.잠금이 작동하지 않는 쿼리 선택

수면을 사용하는 psql 콘솔에서 실행중인 쿼리입니다.

select * from TABLE_NAME for update nowait; SELECT pg_sleep(30); 

내 표는 테스트 목적으로 only one row이 있으므로 조건은 여기 어디에 필요하지 않습니다 :

select * from TABLE_NAME for update; SELECT pg_sleep(30); 

는 또한 nowait을 시도했다.

이제 다른 psql 콘솔에서 동일한 테이블 (30 초 이내에)에서 select 작업을 수행 중이지만 여전히 레코드를 읽을 수 있습니다.

제 질문은 왜이 잠금이 작동하지 않는가입니다. 아니면 올바른 방법이 아닌가? 누군가 나를 안내 할 수 있습니까?

+0

읽기 전용이 아닌 업데이트 용으로 잠글 수 있습니다. 업데이트를 시도하십시오. –

+0

@ClodoaldoNeto 업데이트를 사용했습니다. 기본적으로 다른 사람들이'읽기 '를 막고 싶습니다. 그러나이 테스트 목적을 위해 모든 종류의 작업을 잠그는 것이 나를 위해 할 것입니다. –

+0

전체 테이블을 잠그지 않으면 (읽기 전용 모드를 사용하여) 읽기 요청을 차단할 수 없습니다. –

답변

1

문제는 귀하의 SELECT FOR UPDATE이 효과적이기 위해 거래에 포장되어야한다는 것입니다.

select * from TABLE_NAME for update; SELECT pg_sleep(30); 

이이 별도로 실행이 SQL 문으로 분류됩니다, 그래서 pg_sleep도 시작하기 전에 FOR UPDATE의 잠금 효과가 손실됩니다 :

psql에 한 줄이 입력합니다.

보십시오

select * from TABLE_NAME for update; 

번째 세션이 30 초 동안 차단 볼 :

BEGIN; select * from TABLE_NAME for update; SELECT pg_sleep(30); END; 

다른 세션

.

+0

맞아. 당신의'BEGIN''END' 포장이 그것을 해결했습니다. –

관련 문제