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

华为GaussDB T FOR UPDATE子句

墨天轮 2019-10-12
882

FOR UPDATE子句

FOR UPDATE子句允许锁定所选行,以便其他用户在当前事务结束之前无法锁定或更新行。

语法格式

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中插入记录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中插入记录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中插入记录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));
--插入记录。 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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论