for update 是把所有的表都锁定for update of 根据of 后表的条件锁定相对应的表
--1.锁定整个表
SELECT * FROM emp for UPDATE;
--2.锁定表的单行记录
SELECT * FROM emp a WHERE a.empno='7369' for UPDATE;
--3.锁定两个表
SELECT * FROM emp a,dept b WHERE a.deptno=b.deptno for update;
--4.之锁定of后面指定的表
SELECT * FROM emp a,dept b WHERE a.deptno=b.deptno for UPDATE OF a.empno;
--5.之锁定emp表指定的行
SELECT * FROM emp a,dept b WHERE a.deptno=b.deptno WHERE a.empno='7369' AND a.deptno=b.deptno OF a.empno;
使用for update of column对单表操作时,与for update是一样的效果,但
for update of columns 用在多表连接锁定时,可以指定要锁定的是哪几张表,而如果表中的列没有在forupdate of 后面出现的话,就意味着这张表其实并没有被锁定,其他用户是可以对这些表的数据进行update操作的
关于
SELECT * FROM gumengkai.emp for UPDATE NOWAIT;
当有其他事务锁时,该语句将会立即返回异常信息,而不会无限制的等待
SELECT...FOR UPDATE 语句的语法如下:
SELECT ... FOR UPDATE [OFcolumn_list][WAIT n|NOWAIT][SKIP LOCKED];
如:
SELECT * FROM gumengkai.emp for UPDATE WAIT 5;
等待6秒后,显示异常
SELECT * FROM gumengkai.emp for UPDATE SKIP LOCKED;
在执行sql时,既不等待,也不报异常