PostgreSQL9.5:新增行级锁 SKIP LOCKED 属性

PostgreSQL9.5 新增行级锁 SKIP LOCKED 属性,文档中描述如下:

Add new SELECT option SKIP LOCKED to skip locked rows (Thomas Munro)
This does not throw an error for locked rows like NOWAIT does.

我们知道可以通过 select .. from table where .. for update 语句锁住要更新的记录,在此事务提交前,之后的事务根据不知道这些行被锁住了。9.5 版本新增 SKIP LOCKED 属性,可以跳过这些被锁定的行,使 SQL 不报错,演示下。

环境准备

创建测试表,如下:

1
2
3
4
5
6
7
8
9
[pg95@db2 ~]$ psql fdb fdb  
psql (9.5alpha1)
Type "help" for help.

fdb=> create table test_5(id serial, name character varying(64));
CREATE TABLE

fdb=> insert into test_5(id,name) select n , n|| 'a' from generate_series(1,100) n;
INSERT 0 100

事务A: 更新 id=100 的记录

1
2
3
4
5
6
7
8
fdb=>  begin;  
BEGIN

fdb=> select * from test_5 order by id desc limit 1 for update;
id | name
-----+------
100 | 100a
(1 row)

备注:事务 A 未提交。

事务B: 使用 Nowait 属性

1
2
3
4
5
6
7
fdb=>  begin;  
BEGIN

fdb=> select * from test_5 order by id desc limit 1 for update nowait;
ERROR:could not obtain lock on row in relation "test_5"

fdb=> /q

备注:事务 B 无法获取到 id=100 的行锁。

事务C: 使用 Skip Locked 属性

1
2
3
4
5
fdb=>  select  *  from test_5 order by id desc limit 1  for update skip locked;  
id | name
----+------
99 | 99a
(1 row)

备注:使用 skip locked 属性则跳过了被锁的记录。

参考

原创文章,作者:506227337,如若转载,请注明出处:https://blog.ytso.com/239634.html

(0)
上一篇 2022年2月12日
下一篇 2022年2月12日

相关推荐

发表回复

登录后才能评论