설문조사
PostgreSQL/PPAS 관련 듣고 싶은 교육은


Powered by EnterpriseDB
총 게시물 65건, 최근 0 건
   

PostgreSQL 컬럼 추가시 유의사항

글쓴이 : PostgresDBA 날짜 : 2016-07-07 (목) 10:46 조회 : 1269

오라클과 락 메카니즘이 좀 틀려서 의아해 할수 있습니다.

---------- 오라클 ------------------------------------

#1세션에서 t 라는 빅 테이블을 select 하고 있습니다.

#2세션에서 t 테이블에 컬럼추가를 시도합니다.
--> #1세션에서 select 중이므로  ORA-00054: resource busy and acquire with NOWAIT specified  란 에러를 뿜으며 명령어가 수행되지 않습니다. 대기상태로 빠지지도 않음.

---------- PostgreSQL (autocommit mode) ------------------------------
세션#1, #2, #3 모두 autocommit 모드 전제!
#1세션에서 t 라는 빅 테이블을 select 하고 있습니다.

#2세션에서 t 테이블에 컬럼추가를 시도합니다.
--> #1세션에서 select 중이므로 alter 문이 대기 상태로 빠집니다. 커서만 껌뻑껌뻑

또 다른 #3 세션에서 t 라는 테이블을 조회합니다.
--> select 문이 수행되지 않고 대기 상태로 빠집니다. 껌뻑껌뻑 (주의!!!)

#1세션의 select 문이 완료되자 마자
-->#2세션의 alter 문이 대기상태에서 빠져나와 정상 완료됩니다.
-->#3세션의 select 문도 대기상태에서 빠져나와 정상 완료됩니다.

---------- PostgreSQL (non-autocommit mode) ------------------------------
세션#1은 non-autocommit mode, 세션#2, #3은 autocommit 모드 전제

#1 세션에서 begin; 명령으로 트랜잭션 수행후 t 테이블 조회하고 있습니다.

#2세션에서 t 테이블에 컬럼추가를 시도합니다.
--> #1세션에서 select 중이므로 alter 문이 대기 상태로 빠집니다. 커서만 껌뻑껌뻑

또 다른 #3 세션에서 t 라는 테이블을 조회합니다.
--> select 문이 수행되지 않고 대기 상태로 빠집니다. 껌뻑껌뻑


#1세션의 select 문이 완료됩니다. but!!
-->#2세션의 alter 문이 대기상태 그대로 유지
-->#3세션의 select 문도 대기상태 그대로 유지


#1세션에서 commit 이나 rollback 명령으로 트랜잭션을 종료시킵니다. 그제서야
-->#2세션의 alter 문이 대기상태에서 빠져나와 정상 완료됩니다.
-->#3세션의 select 문도 대기상태에서 빠져나와 정상 완료됩니다.


오늘의 교훈
1. PostgreSQL 에서 간단한 alter 문을 수행시켰는데, 금방 수행되지 않고 대기 상태로 빠지면 바로 cancel 하세요.
무슨 일이 벌어질지 몰라요??? ㅎㅎ

2. 오라클이 PostgreSQL 보다 낫다?
절대 아닙니다. 두 DBMS 가 서로 다를뿐입니다.

PostgreSQL/PPAS 는 CREATE/DROP/ALTER 문도 롤백이 가능합니다.
또한 오라클과 달리 procedure/function 컴파일시에 library cache pin/lock 개념이 없어 락으로 인해 세션들이 폭증할 염려도 없습니다. procedure/function 내부에서 사용되는 테이블에 컬럼이 추가됐다고 해서 일일이 찾아서 재컴파일 할필요도 없습니다.
그렇다고 해서 PostgreSQL 이 Oracle 보다 낫다? 이것도 아닙니다.

어느 데이터베이스를 쓰던지 각 고유한 특성을 잘 인지한후 사용하는게 정말 중요합니다.



   

postgresdba.com