PostgreSQL-잠금

잠금 또는 배타적 잠금 또는 쓰기 잠금은 사용자가 행 또는 전체 테이블을 수정하는 것을 방지합니다. 그런 다음 UPDATE 및 DELETE에 의해 수정 된 행은 트랜잭션 기간 동안 배타적으로 자동으로 잠 깁니다. 이렇게하면 트랜잭션이 커밋되거나 롤백 될 때까지 다른 사용자가 행을 변경할 수 없습니다.

사용자가 다른 사용자를 기다려야하는 유일한 시간은 동일한 행을 수정하려고 할 때입니다. 다른 행을 수정하는 경우 기다릴 필요가 없습니다. SELECT 쿼리는 기다릴 필요가 없습니다.

데이터베이스는 자동으로 잠금을 수행합니다. 그러나 어떤 경우에는 잠금을 수동으로 제어해야합니다. LOCK 명령을 사용하여 수동 잠금을 수행 할 수 있습니다. 트랜잭션의 잠금 유형 및 범위를 지정할 수 있습니다.

LOCK 명령 구문

LOCK 명령의 기본 구문은 다음과 같습니다.

LOCK [ TABLE ]
name
 IN
lock_mode
  • name− 잠글 기존 테이블의 이름 (선택적으로 스키마 규정). 테이블 이름 앞에 ONLY를 지정하면 해당 테이블 만 잠 깁니다. ONLY를 지정하지 않으면 테이블과 모든 하위 테이블 (있는 경우)이 잠 깁니다.

  • lock_mode− 잠금 모드는이 잠금이 충돌하는 잠금을 지정합니다. 잠금 모드를 지정하지 않으면 가장 제한적인 모드 인 ACCESS EXCLUSIVE가 사용됩니다. 가능한 값은 ACCESS SHARE, ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE입니다.

일단 확보되면 현재 트랜잭션의 나머지 동안 잠금이 유지됩니다. UNLOCK TABLE 명령이 없습니다. 잠금은 항상 트랜잭션 종료시 해제됩니다.

교착 상태

교착 상태는 두 트랜잭션이 서로 작업을 완료하기를 기다리고있을 때 발생할 수 있습니다. PostgreSQL이이를 감지하고 ROLLBACK으로 종료 할 수 있지만 교착 상태는 여전히 불편할 수 있습니다. 응용 프로그램에서이 문제가 발생하지 않도록하려면 동일한 순서로 개체를 잠그는 방식으로 응용 프로그램을 디자인해야합니다.

자문 잠금

PostgreSQL은 애플리케이션에서 정의한 의미를 갖는 잠금을 생성하는 수단을 제공합니다. 이를 자문 잠금 이라고 합니다 . 시스템이 사용을 강요하지 않기 때문에 올바르게 사용하는 것은 응용 프로그램에 달려 있습니다. 자문 잠금은 MVCC 모델에 어색한 잠금 전략에 유용 할 수 있습니다.

예를 들어, 자문 잠금의 일반적인 용도는 소위 "플랫 파일"데이터 관리 시스템의 일반적인 비관적 잠금 전략을 에뮬레이션하는 것입니다. 테이블에 저장된 플래그는 동일한 목적으로 사용될 수 있지만 권고 잠금은 더 빠르고 테이블 팽창을 방지하며 세션 종료시 서버에 의해 자동으로 정리됩니다.

다음과 같은 레코드가 있는 테이블 COMPANY 를 고려하십시오.

testdb# select * from COMPANY;
 id | name  | age | address   | salary
----+-------+-----+-----------+--------
  1 | Paul  |  32 | California|  20000
  2 | Allen |  25 | Texas     |  15000
  3 | Teddy |  23 | Norway    |  20000
  4 | Mark  |  25 | Rich-Mond |  65000
  5 | David |  27 | Texas     |  85000
  6 | Kim   |  22 | South-Hall|  45000
  7 | James |  24 | Houston   |  10000
(7 rows)

다음 예제는 ACCESS EXCLUSIVE 모드에서 testdb 데이터베이스 내의 COMPANY 테이블을 잠급니다. LOCK 문은 트랜잭션 모드에서만 작동합니다-

testdb=#BEGIN;
LOCK TABLE company1 IN ACCESS EXCLUSIVE MODE;

위에 주어진 PostgreSQL 문은 다음 결과를 생성합니다-

LOCK TABLE

위의 메시지는 트랜잭션이 끝날 때까지 테이블이 잠겨 있음을 나타내며 트랜잭션을 완료하려면 트랜잭션을 롤백하거나 커밋해야합니다.