두개의 세션 즉,
트랙잭션 모드의 A 세션에서 특정 테이블을 SELECT 한후,
다른 B 세션에서 그 테이블을 TRUNCATE 하고자 할때 각각 오라클과 PostgreSQL 에서 어떻게 달리 반응하는지 알아봅시다.
---------------------------------------------------------------------------
오라클
----------------------------------------------------------------------------
[A 세션]
SQL> create table x(x int);
Table created.
SQL> insert into x values(100);
1 row created.
SQL> commit;
Commit complete.
SQL> select * from x;
X
----------
100
[B 세션]
SQL> truncate table x;
Table truncated. -- 정상적으로 수행됩니다.
SQL>
참고로 A 세션에서 QUERY 가 아닌 아래 DML 을 수행후 COMMIT 을 안한 상태에서
SQL> insert into x values(200);
1 row created.
아래 B 세션에서 TRUNCATE 시는 오라클은 아래와 같이 반응합니다.
SQL> truncate table x;
truncate table x
*
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified
SQL>
---------------------------------------------------------------------------
PostgreSQL/PostgreSQL Advanced Server
----------------------------------------------------------------------------
[A세션] -- 세션 pid 30500
SQL> begin;
BEGIN
SQL*> create table x(x int);
CREATE TABLE
SQL*> insert into x values(100);
INSERT 0 1
SQL*> commit;
COMMIT
SQL> begin;
BEGIN
SQL*> select * from x; -- 트랜잭션 모드에서의 SELECT 문
x
-----
100
(1 row)
SQL*>
[B세션] -- 세션 pid 30577
SQL> truncate table x; -- 진행이 안되고 멍하니 커서만 깜빡 거립니다. (사실 대부분의 DBMS 가 이와 같은 반응을 보입니다.)
..........................
PostgreSQL log 에서는 아래와 같은 기록이 남습니다.
2017-01-17 10:46:58 KST [30577]: [3-1] db=testdb,user=test,app=[psql.bin],host=[[local]] LOG: process 30577 still waiting for AccessExclusiveLock on relation 8677707 of database 16441 after 1000.093 ms
2017-01-17 10:46:58 KST [30577]: [4-1] db=testdb,user=test,app=[psql.bin],host=[[local]] DETAIL: Process holding the lock: 30500. Wait queue: 30577.
2017-01-17 10:46:58 KST [30577]: [5-1] db=testdb,user=test,app=[psql.bin],host=[[local]] STATEMENT: truncate table x;
..........................
각 DBMS 의 행동방식(?) 을 잘 파악한후 사용하시기 바랍니다.