PostgreSQL 트랜잭션 격리수준 확인/변경
- Development/Database
- 2021. 4. 10.
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 세 개의 트랜잭션 격리수준이 지원된다고 볼 수 있다.
참고
* Docker기반 설치
Docker로 띄운 PostgreSQL에 접속하기 위해 다음과 같은 커맨드를 실행한다.
$ psql -h 127.0.0.1 -d db명 -U 사용자명 -W
'Development > Database' 카테고리의 다른 글
MySQL Time Zone 변경 방법 (0) | 2021.05.17 |
---|---|
OLTP, OLAP 비교 (0) | 2021.04.26 |
PostgreSQL - 트랜잭션 격리 수준(transaction isolation level) 테스트 (0) | 2021.04.17 |
PostgreSQL에서 auto_increment는? (0) | 2021.04.15 |
MySQL - 트랜잭션 격리 수준 (transaction isolation level) 테스트 (0) | 2021.04.04 |
MySQL 트랜잭션 격리수준 확인/변경 (0) | 2021.03.27 |
psql (postgresql client) command (0) | 2021.03.17 |
Docker 기반 Postgresql 설치하기 (0) | 2021.03.11 |