语法格式
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;