Oracle 行级共享锁
行级共享锁通常是 SELECT … FROM FOR UPDATE 语句来添加的,该方法也是手工锁定某些记录的主要方法,比如,当我们在查询某些记录的过程中,不希望其他用户对查询的记录进行更新操作,则可以发出这样的语句。当数据使用完毕以后,直接发出 ROLLBACK 命令将锁定解除(如果我们查询到了并且修改了,则 COMMIT 后就可以释放锁)。
SELECT … FOR UPDATE
示例:1
SELECT * FROM goods WHERE goods_code ='001' FOR UPDATE;
当 SELECT 语句中使用了 FOR UPDATE,如果当前 SELECT 发现自己的结果集中有一条或者多条数据正在被修改,例如有其他的语句提前 FOR UPDATE,那么再执行此语句就会一直等待;
此时执行:
UPDATE/DELETE 等语句都出现等待。只有对应的占用锁的数据被提交 COMMIT(或者 ROLLBACK)时才可以进行新的 FOR UPDATE 上锁或者进行 UPDATE/DELETE。
SELECT … FOR UPDATE NOWAIT
示例:1
SELECT * FROM goods WHERE goods_code ='001' FOR UPDATE NOWAIT;
FOR UPDATE NOWAIT 和 FOR UPDATE 都会对查询到的当前结果集进行加锁。区别是 FOR UPDATE NOWAIT 发现自己要加锁的结果集正在被其他操作修改(已经被加锁),则直接反馈资源占用,不会像 FOR UPDATE 一样等待执行。
SELECT … FOR UPDATE WAIT
示例:1
SELECT * FROM goods WHERE goods_code ='001' FOR UPDATE WAIT;
与 FOR UPDATE NOWAIT 的区别是 FOR UPDATE WAIT 可配置等待时间,单位秒。当过了这个时间,被加锁资源还未被释放,则和 FOR UPDATE NOWAIT 一样直接反馈资源占用,否则执行此语句。
SELECT … FOR UPDATE SKIP LOCKED
示例:1
SELECT * FROM goods FOR UPDATE SKIP LOCKED;
跳过加锁行,对满足条件的其他行进行加锁。
SELECT … INNER JOIN … FOR UPDATE
示例:1
SELECT * FROM stat_dic_goods sg INNER JOIN goods g ON sg.goods_code = g.goods_code WHERE sg.goods_code = '001' FOR UPDATE;
关联的表都加锁。
SELECT … INNER JOIN … FOR UPDATE OF …
示例:1
SELECT * FROM stat_dic_goods sg INNER JOIN goods g ON sg.goods_code = g.goods_code WHERE sg.goods_code = '001' FOR UPDATE OF sg.goods_code;
对关联的表中的某一张表进行加锁。
Oracle 共享锁
LOCK TABLE stat_dic_goods IN SHARE MODE
执行完 lock 语句再执行 update 语句就会出现等待中,因为 lock 语句已经将这个表锁了,此时只允许读取不允许修改。通过 lock table in share mode 命令添加该S锁。在该锁定模式下,不允许任何用户更新表。但是允许其他用户发出 select … from for update 命令对表添加 RS 锁。Oracle 只有表级别的共享锁没有行级别的共享锁,行级别的是排他锁,多个用户可以同时对同一个表加共享锁。
Oracle 排他锁
LOCK TABLE stat_dic_goods IN EXCLUSIVE MODE
同一张表不能同时执行共享锁和排他锁。通过 lock table in exclusive mode 命令添加 X 锁。在该锁定模式下,其他用户不能对表进行任何的 DML 和 DDL 操作,该表上只能进行查询。
Oracle 行级排他锁
LOCK TABLE stat_dic_goods IN ROW EXCLUSIVE MODE
当我们进行 DML 时会自动在被更新的表上添加 RX 锁,或者也可以通过执行 lock 命令显式的在表上添加RX 锁。在该锁定模式下,允许其他的事务通过 DML 语句修改相同表里的其他数据行,或通过 lock 命令对相同表添加 RX 锁定,但是不允许其他事务对相同的表添加排他锁(X 锁)。
Oracle 共享行级排他锁
LOCK TABLE stat_dic_goods IN SHARE ROW EXCLUSIVE MODE
通过 lock table in share row exclusive mode 命令添加 SRX 锁。该锁定模式比行级排他锁和共享锁的级别都要高,这时不能对相同的表进行DML操作,也不能添加共享锁。