PostgreSQL 트랜잭션 격리수준 확인/변경

본 포스트에서는 PostgreSQL 트랜잭션 격리수준을 확인하는 방법과 변경하는 방법에 대해 정리한다.

 

트랜잭션 격리수준 확인하기

SELECT current_setting('transaction_isolation');

또는,

show transaction isolation level;

이 명령어를 실행한 결과는 다음과 같이 노출된다.

current_setting
-----------------
 read committed
(1 row)

 

트랜잭션 격리수준 변경하기

트랜잭션 격리수준을 필요에 따라 아래와 같은 방법으로 변경할 수 있다.

설정으로 변경하기

postgresql.conf내 설정을 변경한다.

#default_transaction_isolation = 'read committed'

기본적으로 주석처리가 되어 있으나, 저 설정을 변경하고 서비스를 다시 시작한다.

 

명령어로 변경하기 (글로벌)

ALTER SYSTEM SET DEDFAULT_TRANSACTION_ISOLATION TO 'read committed';
ALTER DATABASE DB이름 SET DEDFAULT_TRANSACTION_ISOLATION TO 'read committed';

실제 적용 테스트를 아래와 같이 진행하였다.

mydb=# alter database mydb set default_transaction_isolation to 'repeatable read';
ALTER DATABASE

mydb=# show transaction isolation level;
 transaction_isolation
-----------------------
 read committed
(1 row)

그러나, 재접속해서 다시 확인하면 다음과 같이 적용되었음을 확인할 수 있다.

mydb=# show transaction isolation level;
 transaction_isolation
-----------------------
 repeatable read
(1 row)

 

명령어로 변경하기(세션)

PostgreSQL에서 트랜잭션 변경은 다음과 같이 할 수 있다.

SET TRANSACTION transaction_mode [, ...]
SET TRANSACTION SNAPSHOT snapshot_id
SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode [, ...]

where transaction_mode is one of:

    ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }
    READ WRITE | READ ONLY
    [ NOT ] DEFERRABLE

 

트랜잭션 격리수준 변경 적용/ 확인

트랜잭션 격리수준 변경은 아래와 같이 실행할 수 있다.

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

PostgreSQL에서 트랜잭션 격리수준 기본값은 READ COMMITTED이다. 이 값을 READ UNCOMITTED로 변경하는 시도를 해본다.

mydb=# set transaction isolation level read uncommitted;
WARNING:  SET TRANSACTION can only be used in transaction blocks
SET

mydb=# show transaction isolation level;
 transaction_isolation
-----------------------
 read committed
(1 row)

위 메시지가 뜻하는 바는, 트랜잭션 블럭내에서만 위 명령어를 실행할 수 있다는 뜻이다. 그래서 명령어를 실행했음에도 트랜잭션 격리수준이 변경되지 않았고, 조회 명령어로 확인해 봐도 기본값인 read committed로 조회되는 것을 확인할 수 있다.

위의 명령이 동작하게 하려면, Warning 메시지를 따라 다음과 같이 실행해 보자.

mydb=# begin;
BEGIN

mydb=*# set transaction isolation level read uncommitted;
SET

mydb=*# show transaction isolation level;
 transaction_isolation
-----------------------
 read uncommitted
(1 row)

mydb=*# rollback;
ROLLBACK

BEGIN문으로 트랜잭션을 시작시켜놓고, 위의 명령어를 다시 실행하면 트랜잭션 격리수준이 정상적으로 변경되었음을 확인할 수 있다. 위의 명령어를 합쳐서 다음과 같이 실행할 수 있다.

mydb=# begin transaction isolation level read uncommitted;
BEGIN

mydb=*# show transaction isolation level;
 transaction_isolation
-----------------------
 read uncommitted
(1 row)

mydb=*# rollback;
ROLLBACK

다른 격리수준의 경우도 동일하게 적용가능하다. 표준 정의에 따라, 네 개의 트랜잭션 격리수준을 정의하고 설정할 수 있지만, PostgreSQL의 경우, read uncommitted는 read committed와 동일하게 취급되기 때문에 사실상 Read Committed, Repeatable Read, Serializable 세 개의 트랜잭션 격리수준이 지원된다고 볼 수 있다. 

 

참고

 

SET TRANSACTION

SET TRANSACTION SET TRANSACTION — set the characteristics of the current transaction Synopsis SET TRANSACTION transaction_mode [, ...] SET TRANSACTION …

www.postgresql.org

* Docker기반 설치

 

Docker 기반 Postgresql 설치하기

Docker를 사용하여 Postgresql을 설치하는 방법을 정리한다. docker-compose.yml YAML 파일의 기본 골격을 다음과 같이 작성한다. version: "3" services: db: image: postgres:latest container_name: postgres..

luran.me

Docker로 띄운 PostgreSQL에 접속하기 위해 다음과 같은 커맨드를 실행한다.

$ psql -h 127.0.0.1 -d db명 -U 사용자명 -W

댓글(0)

Designed by JB FACTORY