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


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

트랙잭션과 TRUNCATE

글쓴이 : PostgresDBA 날짜 : 2017-01-17 (화) 13:16 조회 : 586

두개의 세션 즉,

트랙잭션 모드의 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 의 행동방식(?) 을 잘 파악한후 사용하시기 바랍니다.



   

postgresdba.com