ITPub博客

首页 > 应用开发 > IT综合 > Oracle vs PostgreSQL,研发注意事项(1)-查询锁表

Oracle vs PostgreSQL,研发注意事项(1)-查询锁表

原创 IT综合 作者:husthxd 时间:2018-07-20 13:25:17 0 删除 编辑

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一直等待该锁释放后才能执行。

参考:

https://www.postgresql.org/docs/11/static/explicit-locking.html

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/6906/viewspace-2158210/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
ITPUB数据库版块资深版主,对Oracle、PostgreSQL有深入研究。

注册时间:2007-12-28

  • 博文量
    1602
  • 访问量
    4380165