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

     

    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

    댓글

    Designed by JB FACTORY