Locks
在单用户系统,LOCKS是不需要的。在多用户系统,为了让多用户访问数据,修改数据,修改数据结构,就需要一个机制来保证大家的一致性修改。该用LOCK的时候就用LOCK,LOCKS是一种为了让你正常使用DB的工具,所以并不需要避免它(当然低劣的设计造成的不必要的LOCK应该避免,同时注意在你需要的时候保持LOCK,不需要的时候释放)。在row-Level lock上LOCK并不会消耗很多资源,因为你LOCK 1 ROW和1W ROW,LOCK所需要用的资源都是一样的。READ动作不会被WRITE动作所BLOCK,WRITE动作也不会被READ动作所BLOCK。
流程类似于
A:发现你要操作的那行数据的地址。
B:去这行。
C:lock这行(如果这行已经lock了则等待其释放,除非你用nowait选项)
管理起来非常简单,那是因为lock做为DATA的属性进行管理。
Lock Types
DML LOCKS又细分为以下类型
见(DBMS_LOCK包测试ORACLE LOCK
http://sunmoonking.spaces.live.com/blog/cns!E3BD9CBED01777CA!590.entry)
一般提示ORA-00054: resource busy and acquire with NOWAIT specified
我们也可以用ALTER TABLE TABLENAME DISABLE TABLE LOCK来取消TM锁,这样我们就无法DROP此表了。
SQL> create table t1 ( x int );
Table created.
SQL> create table t2 ( x int );
Table created.
SQL> insert into t1 values ( 1 );
1 row created.
SQL> insert into t2 values ( 1 );
1 row created.
1 select (select username
from v$session
where sid = v$lock.sid) username,
sid,
id1,
id2,
lmode,
request, block, v$lock.type
from v$lock
where sid = (select sid
from v$mystat
where rownum=1)
SQL> /
USERNAME SID
------------------------------------------------------------ ----------
ID1 ID2 LMODE REQUEST BLOCK TYPE
---------- ---------- ---------- ---------- ---------- ----
SBTOPT 23
13444 0 3 0 0 TM
SBTOPT 23
13445 0 3 0 0 TM
SBTOPT 23
327743 68571 6 0 0 TX
SQL> select object_name, object_id
2 from user_objects
3 where object_name in ('T1','T2')
4 /
OBJECT_NAME OBJECT_ID
------------------------------------------------------------------------
T2 13445
T1 13444
一个TRANSACTION只能有一个TX LOCK,可以有多个TM LOCK,也可以看到TM LOCK的ID1是OBJECT_ID,TM LOCKS的数量由DML_LOCKS决定。
在有TM LOCK的情况下,我们DROP TABLE T1会发生什么呢
SQL> drop table t1
2 /
Table dropped.
表为什么被删除了呢?
因为DROP是DDL语句,在DDL语句前和后都会触发COMMIT而不管DDL语句执行成功否。那让我们再接着看DDL LOCKS
-
DDL locks
-
Exclusive DDL locks:
防止其他SESSION获得DDL LOCK或TM LOCK
其他SESSION不能修改表结构,但是可以修改数据
不会阻止DDL语句
LATCH按如下流程获得
Attempt to get Latch
If Latch gotten
Then
return SUCCESS
Else
Misses on that Latch = Misses+1;
Loop
Sleeps on Latch = Sleeps + 1
For I in 1 .. 2000
Loop
Attempt to get Latch
If Latch gotten
Then
Return SUCCESS
End if
End loop
Go to sleep for short period
End loop
End if
如果没有得到LATCH,则会LOOP一定数量(2000),在LOOP的过程中如果成功,则返回并继续运行程序,如果没有成功,则SLEEP一定时间再LOOP。LATCH持有的时间不会很长,但是发生阻塞后试图获得LATCH的过程会消耗CPU的,会使系统看起来很BUSY。
CPU Usage Comparison With and Without Bind Variables
| Waits for Latches
| CPU Seconds/Elapsed |Shared Pool Latch |(Number of Waits/Time
Users | Time in Minutes | Requests | in Wait in Seconds)
| No Binds Binds | No Binds Binds| No Binds Binds
1 26/0.52 4/0.10 563,883 25,232 0/0
2 74/0.78 11/0.20 1,126,006 50,367 406/1
3 155/1.13 29/0.37 1,712,280 75,541 2,830/4
4 272/1.50 44/0.45 2,298,179 100,682 9,400/5
5 370/2.03 64/0.62 2,920,219 125,933 13,800/20
6 466/2.58 74/0.72 3,526,704 150,957 30,800/80 17/0
7 564/3.15 95/0.92 4,172,492 176,085 40,800/154
8 664/3.57 106/1.00 4,734,793 201,351 56,300/240 120/1
9 747/4.05 117/1.15 5,360,188 230,516 74,600/374 230/1
10 822/4.42 137/1.30 5,901,981 251,43 60,000/450 354/1
可以看到是否BIND对LATCH有很大影响
手工LOCK和用户自定义LOCK
在前面我们明白,当我们UPDATE的时候,获得一个TM LOCK来防止其他SESSION 去DROP TABLE(DDL);获得一个TX LOCK来表示那些数据是我们OWN的;DDL LOCK用来在我们自己改变OBJECT的时候保护OBJECTS不被其他人改变,那我们如何主动利用LOCK呢?
SELECT...FOR UPDATE是最常用的一种,通常用来实现某种商业规则(SELECT FOR UPDATE 相关的知识
LOCK TABLE IN EXCLUSIVE MODE,用在你需要大批量做更新,而又不希望别人BLOCK你.
用户自定义的LOCK请参考DBMS_LOCK包测试ORACLE LOCK
• TX locks: These locks are acquired for the duration of a data-modifying transaction.
• TM and DDL locks: These locks ensure that the structure of an object is not altered
while you are modifying its contents (TM lock) or the object itself (DDL lock).
• Latches: These are internal locks that Oracle employs to mediate access to its shared
data structures.