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

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博客 ” ,链接:http://blog.itpub.net/6906/viewspace-2158210/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/6906/viewspace-2158210/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值