FOR UPDATE 语句
FOR UPDATE 语句是用于锁住表的部分或全部数据(多用于pl/sql developer手动修改数据;也可以用来在Oracle函数中用来锁表数据,然后再执行操作数据的语句,以保证数据的唯一性)。
锁住表的部分或全部数据的意思即除了当前执行for update这个事务,不允许其他的事务对锁住的数据进行增、删、改操作,这里体现了数据的唯一性。
注意:正常情况下锁表,对数据进行操作后一定要记得commit提交。因为正常情况下只有通过commit或者rollback才能解除锁。
例:SELECT * FROM TABLE1 WHERE DEPTNO = 10 FOR UPDATE ; --只对满足条件的部门编号为10的数据进行锁定
SELECT * FROM TABLE1 WHERE FOR UPDATE ; --对TABLEFORTEST 表当前的所有数据进行锁定(即新增的数据不受影响,随便嗨)
FOR UPDATE的延申用法:
FOR UPDATE OF COLUMN、FOR UPDATE WAIT、FOR UPDATE NOTWAIT、FOR UPDATE SKIP LOCKED
例:SELECT * FROM TABLE1 E , TABLE2 D WHERE E.DEPTNO = D.DEPTNO AND E.DEPTNO = 10 FOR UPDATE ; -- 锁定两个表中满足条件的行
SELECT * FROM TABLE1 E , TABLE2 D WHERE E.DEPTNO = D.DEPTNO AND E.DEPTNO = 10 FOR UPDATE OF E.DEPTNO ;
--只会锁定TABLE1 表中满足条件的行
FOR UPDATE OF E.DEPTNO(OF 后面跟的是哪张表及其列名【形式就是表名{表别名}.列名,这样更准确】就会锁定哪张表中满足条件的行)
SELECT * FROM TABLE1 WHERE FOR UPDATE WAIT 3; --执行这个语句时如果有另一个事务已经获取了这部分数据的锁进行数据操作,那么会根据设置的参数进行等待
(参数的单位是秒,直接写值,不用带单位),超过这个时间后还无法获取到当前数据的锁就回返回错误信息②
SELECT * FROM TABLE1 WHERE FOR UPDATE NOWAIT ; --执行这个语句时如果有另一个事务已经获取了这部分数据的锁进行数据操作,那么会直接返回错误信息①
SELECT * FROM TABLE1 WHERE FOR UPDATE SKIP LOCKED; --执行这个语句时如果有另一个事务已经获取了这部分数据的锁进行数据操作,且这个事务要操作的数据
和另一个事务操作的数据完全一致就会返回一个空的列表;如果数据只是部分重叠,那么就会返回当前事务和另一个事务未重叠部分的数据并加上锁。
错误信息:
①ORA-00054:资源正忙,但指定以NOWAIT方式获取资源,或者超时失效
②ORA-30006:资源已被占用;执行操作时出现WAIT超时
参考资料:http://www.360doc.com/content/19/0114/22/39573434_808893974.shtml
https://www.cnblogs.com/zbj815/p/6844434.html
------------------------------------------------------------------------------------------------------------------