暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

华为GaussDB T 支持for update锁行操作

原创 章芋文 2019-10-03
739

语法格式

FOR UPDATE [ OF col_list ] [ { WAIT sec | NOWAIT } ]

使用方法

FOR UPDATE子句只能在顶级SELECT语句中指定,不能在子查询中指定。

OF col_list 指定当涉及多个表操作时,可以使用OF子句指定需要更新的列。当表中的列出现在for update of后面,该表中满足条件的记录就会被锁定,如果表中的列没有出现在for update of列表中,该表则不会被锁定。

WAIT sec | NOWAIT用于指定锁定等待模式。WAIT sec表示等待sec秒数,超过时间没有获得锁就报错返回,可避免无限期等待。NOWAIT表示不等待,如果资源被锁定就立即返回。

示例

该示例中,查询语句使用FOR UPDATE子句,会锁定满足查询条件的记录。

--删除表education。

DROP TABLE IF EXISTS education;

--创建表education。

CREATE TABLE education(staff_id INT, higest_degree CHAR(8) NOT NULL, graduate_school VARCHAR(64), graduate_date DATETIME, education_note VARCHAR(70));

--向表education中INSER记录1。

INSERT INTO education(staff_id,higest_degree,graduate_school,graduate_date,education_note) VALUES(10,'doctor','Xidian University','2017-07-06 12:00:00','211');

--向表education中INSER记录2。

INSERT INTO education(staff_id,higest_degree,graduate_school,graduate_date,education_note) VALUES(11,'master','Northwestern Polytechnical University','2017-07-06 12:00:00','211&985');

--向表education中INSER记录3。

INSERT INTO education(staff_id,higest_degree,graduate_school,graduate_date,education_note) VALUES(12,'scholar','Peking University','2017-07-06 12:00:00','211&985');

--提交事务。

COMMIT;

--查询语句使用FOR UPDATE子句,锁定表education中higest_degree的值为doctor的记录。

SELECT staff_id, higest_degree FROM education WHERE higest_degree='doctor' FOR UPDATE;


STAFF_ID     HIGEST_DEGREE

------------ -------------

10           doctor


1 rows fetched.

--删除表T_UPDATE,S_UPDATE。 

DROP TABLE IF EXISTS T_UPDATE;

DROP TABLE IF EXISTS S_UPDATE;

--创建表T_UPDATE,S_UPDATE。 

CREATE TABLE T_UPDATE(a varchar(20), b varchar(20)); CREATE TABLE S_UPDATE(a varchar(20), b varchar(20));

--INSER记录。 

INSERT INTO T_UPDATE VALUES('1','1'); 

INSERT INTO T_UPDATE VALUES('2','2'); 

INSERT INTO S_UPDATE VALUES('1','2'); 

INSERT INTO S_UPDATE VALUES('2','1');

--使用FOR UPDATE锁定表T_UPDATE。

SELECT T_UPDATE.a, S_UPDATE.b FROM T_UPDATE JOIN S_UPDATE  ON T_UPDATE.a = S_UPDATE.a WHERE T_UPDATE.a=1 FOR UPDATE OF T_UPDATE.a;

--使用 FOR UPDATE NOWAIT会报错,T_UPDATE.a=1记录被锁定。 

SELECT * FROM T_UPDATE WHERE T_UPDATE.a=1 FOR UPDATE NOWAIT; 

--执行示例,S_UPDATE 未被锁定。 

SELECT * FROM S_UPDATE  for update nowait;

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论