oracle表级锁
--//session one
SQL> LOCK TABLE stuInfo IN SHARE MODE NOWAIT;
表已锁定。
--//session two
SQL> LOCK TABLE stuInfo IN SHARE MODE NOWAIT;
表已锁定。
--//session one
SQL> LOCK TABLE stuInfo IN EXCLUSIVE MODE NOWAIT;
表已锁定。
--//session two
SQL> LOCK TABLE stuInfo IN EXCLUSIVE MODE NOWAIT;
LOCK TABLE stuInfo IN EXCLUSIVE MODE NOWAIT
*
ERROR 位于第 1 行:
ORA-00054: 资源正忙,要求指定 NOWAIT
ROW SHARE :
可以多个用户更新不同行,但是不允许其他用户加EXCLUSIVE锁
--//session one
LOCK TABLE stuInfo IN ROW SHARE MODE;
ok...
UPDATE stuInfo SET stuName = 'SSS' WHERE stuID='001';
ok...
--//session two
UPDATE stuInfo SET stuName = 'SSS' WHERE stuID='001';
ok...
LOCK TABLE stuInfo IN EXCLUSIVE MODE;
wait ..................................
--//session one
COMMIT;
--//session two
COMMIT;
-//session one
LOCK TABLE stuInfo IN ROW SHARE MODE;
ok...
--//session two
LOCK TABLE stuInfo IN ROW SHARE MODE;
或者
LOCK TABLE stuInfo IN SHARE MODE;
ok...
ROW SHARE 行共享,允许其他用户同时更新其他行,允许其他用户同时加共享锁,不允许有独占(排他性质)的锁
ROW EXCLUSIVE 行排他,允许其他用户同时更新其他行,只允许其他用户同时加行共享锁或者行排他锁
SHARE 共享,不允许其他用户同时更新任何行,只允许其他用户同时加共享锁或者行共享锁
SHARE ROW EXCLUSIVE 共享行排他,允许其他用户同时更新其他行,只允许其他用户同时加行共享锁
EXCLUSIVE 排他,其他用户禁止更新任何行,禁止其他用户同时加任何锁
类型 允许其他用户同时更新其他行 同时加ROW SHARE 同时加ROW EXCLUSIVE 同时加SHARE 同时加SHARE ROW EXCLUSIVE 同时加EXCLUSIVE
-------------------------------------------------------------------------------------------------------------------------------------------------------------
ROW SHARE Y Y Y Y Y
-------------------------------------------------------------------------------------------------------------------------------------------------------------
ROW EXCLUSIVE Y Y Y
-------------------------------------------------------------------------------------------------------------------------------------------------------------
SHARE N Y Y
-------------------------------------------------------------------------------------------------------------------------------------------------------------
SHARE ROW EXCLUSIVE Y Y
-------------------------------------------------------------------------------------------------------------------------------------------------------------
EXCLUSIVE N
总结:名称中带ROW的锁的共性是允许其他用户同时更新不同行,
根据是否允许其他用户同时加锁的种类不同而分不同类型
如果不希望别的session lock/insert/update/delete表中任意一行,只允许查询,
可以用lock table table_name in exclusive mode。(X)这个锁定模式级别最高,并发度最小。
如果允许别的session查询或用select for update锁定记录,不允许insert/update/delete,
可以用lock table table_name in share row exclusive mode。(SRX)
如果允许别的session查询或select for update以及lock table table_name in share mode,
只是不允许insert/update/delete,可以用lock table table_name in share mode。
(share mode和share row exclusive mode的区别在于一个是非抢占式的而另一个是抢占式的。
进入share row exclusive mode后其他session不能阻止你insert/update/delete,
而进入share mode后其他session也同样可以进入share mode,进而阻止你对表的修改。(S)
还有两种锁定模式,row share(RS)和row exclusive(RX)。他们允许的并发操作更多,
一般直接用DML语句自动获得,而不用lock语句。