2011-02-18 4 views
2

나는 Postgres에서 글쓰기 전체 테이블을 잠그는 방법을 알아 내려고 노력하고 있는데, 그렇게하지 않는 것 같아서 내가 잘못하고 있다고 가정하고 있습니다.PostgreSQL 잠그는 질문

예를 들어 테이블 이름은 '사용자'입니다.

독점 모드의 LOCK TABLE 사용자;

보기 pg_locks를 확인하면 거기에없는 것 같습니다. 난 다른 잠금 모드뿐만 아니라 아무 소용이 시도했다.

다른 트랜잭션도 LOCK 기능을 수행 할 수 있으며 내가 가정 한대로 차단하지 않습니다.

psql 도구 (8.1)에서 간단히 LOCK TABLE을 다시 얻습니다.

도움이 될 것입니다.

+1

왜 테이블을 잠그시겠습니까? –

답변

9

:

는 ("LOCK 표는 트랜잭션 블록에서 사용할 수있는"8.1 아주 오래된 9.0이 오류가 있습니다.) 트랜잭션의 동시성 수준. 이 같은 트랜잭션에서 LOCK을 사용할 수 있어야합니다.

BEGIN WORK; 
LOCK TABLE table_name IN ACCESS EXCLUSIVE MODE; 
SELECT * FROM table_name WHERE id=10; 
Update table_name SET field1=test WHERE id=10; 
COMMIT WORK; 

저는 실제로 이것을 db에서 테스트했습니다.

+1

'access exclusive mode'는 다른 프로세스가 테이블에 쓰기 만하는 것이 아니라 테이블에서 읽는 것을 방지합니다. 'share row exclusive mode'를 사용하여 갱신 또는 삽입을 실행하는 다른 프로세스에 대해 테이블을 특별히 잠글 수 있습니다. – araqnid

4

"잠금 테이블"은 트랜잭션이 끝날 때까지만 유지된다는 점에 유의하십시오. 따라서 psql에서 "begin"을 이미 발행하지 않는 한 비효율적입니다. 대신 지정 SET 트랜잭션을 사용하는 표준 SQL에는 LOCK TABLE이 없습니다

+0

좋아, 그건 내 바보 야. 감사! – jreid42