oracle表级锁 2008-04-25 21:08

字号:    

 

--//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语句。

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
网易公司版权所有 ©1997-2009