Oracle vs PostgreSQL,研發注意事項(1)-查詢鎖表

husthxd發表於2018-07-20

Oracle資料庫,查詢語句不會鎖表,但PostgreSQL在開啟事務後,查詢資料表會鎖表,在試圖DROP/TRUNCATE TABLE時會一直等待。

--------------------------- Session A

drop table if exists t1;

-- 開啟事務

begin;

-- 查詢當前事務號

select txid_current(); 

-- 建立表&插入100w資料

create table t1(id int,c1 varchar(20));

-- 查詢當前事務號

select txid_current(); 

insert into t1 select generate_series(1,1000000),'#TESTDATA#';

-- 提交事務

end;

--------------------------- Session B

-- 開啟事務

begin;

-- 查詢當前事務號

select txid_current(); 

-- 查詢資料表

select count(*) from t1;

--------------------------- Session A

-- 重新回到Session A,刪除資料表

drop table t1; -- 這時會一直等待


查詢資料庫鎖資訊:

testdb=# SELECT pid, relname , locktype, mode

testdb-# FROM pg_locks l JOIN pg_class t ON l.relation = t.oid

testdb-#      AND t.relkind = 'r'

testdb-# WHERE t.relname = 't1';

pid  | relname | locktype |        mode       

------+---------+----------+---------------------

1574 | t1      | relation | AccessShareLock

1585 | t1      | relation | AccessExclusiveLock

(2 rows)

發現查詢t1(1574為Session B的pid)時會持有AccessShareLock,導致drop table一直等待該鎖釋放後才能執行。

參考:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/6906/viewspace-2158210/,如需轉載,請註明出處,否則將追究法律責任。

相關文章