2012-04-23 6 views
6

나는 뭔가 기본적인 것이 있어야한다고 생각합니다. 포스트 그레스에서 자문 잠금에 대해 이해하지 못합니다. 나는 psql의 명령 행 클라이언트에서 다음 명령을 입력하면, 함수는 두 번 true를 돌려 :포스트 그레스에서 자문 잠금 획득

SELECT pg_try_advisory_lock(20); --> true 
SELECT pg_try_advisory_lock(20); --> true 

내가 잠금이 이미 취득한해야하기 때문에 두 번째 명령이 false를 반환해야 함을 기대하고 있었다. 이상하게도, 나는 자물쇠를 두 번 취득한 것을 제안, 다음을 얻는다 :

SELECT pg_advisory_unlock(20); --> true 
SELECT pg_advisory_unlock(20); --> true 
SELECT pg_advisory_unlock(20); --> false 

그래서 내 질문은, 어떻게 하나가 다시 인수하고 중지하는 방법에 자문 잠금을 획득 않는 추측?

+8

동일한 세션에서 원하는만큼 여러 번 동일한 잠금을 얻을 수 있습니다. 다른 세션에서 잠금을 획득하려면 동일한 횟수만큼 세션을 닫거나 세션을 닫아야합니다. – kgrittn

답변

11

2 가지 다른 PostgreSQL 세션에서이 작업을 시도해보십시오.

자세한 내용은 in the docs을 확인하십시오.

+2

아아, 나는 세션이 잠금을 획득하면 다시 획득 할 수 있지만 다른 세션은 얻을 수 없다. 감사! – foldl

3

자물쇠에 대한 나의 첫인상은 비슷했다. 두 번째 쿼리 (SELECT pg_tryadvisory_lock (20))가 false를 반환 할 것으로 예상했습니다 (첫 번째 잠금이 있기 때문에). 그러나이 쿼리는 값이 20 인 bigInt에 잠금이 있음을 확인했습니다. 해석은 사용자의 책임입니다.

값을 저장하고 해당 값 (보통 BigInt)을 잠글 수있는 테이블로 자문 잠금을 상상해보십시오. 그것은 명시 적 잠금 장치가 아니며 전송이 지연되지 않습니다. 결과를 해석하고 사용하는 방법은 사용자에 따라 다르며 차단되지 않습니다.

두 개의 정수 옵션이있는 프로젝트에서 사용합니다. SELECT pg_try_advisory_lock (classId, objId) 두 매개 변수가 모두 정수입니다. 그냥 CLASSID와 테이블과 OBJID 등 (여기 17) 차 ID의 OID 사용 개 이상의 테이블로 작동하도록

"first_table"이 예에서

SELECT pg_try_advisory_lock((SELECT 'first_table'::regclass::oid)::integer, 17);

인 테이블의 이름이며 두 번째 정수는 기본 키 ID (여기에서는 17)입니다.

bigInt 매개 변수를 사용하면 더 넓은 범위의 ID를 사용할 수 있지만 "17"이라는 ID를 잠그기 때문에 ID가 17보다 큰 "second_table"을 사용하면 특정 행과의 관계가 잠겨 있기 때문에 테이블에).

자물쇠 잠금 장치의 내부 동작을 이해하는 데 도움이되기를 바랍니다.

+0

나는 이것을 이해하지 못했다. 당신은 언급했다. 그러나 만약 당신이 "second_table"을 사용하면 17 번 아이디가 잠긴다. 다음 쿼리를 사용할 때 id 17이 위의 경우에 권고 자물쇠로 잠겨지는 것을 어떻게 알 수 있을까? 'SELECT pg_try_advisory_lock ((SELECT 'first_table':: regclass :: oid) :: integer, 17);' – Viren

관련 문제