设为首页 收藏本站
查看: 742|回复: 0

[经验分享] ORACLE深入 第五章 Locking and Latching

[复制链接]

尚未签到

发表于 2016-7-26 11:56:22 | 显示全部楼层 |阅读模式
ORACLE深入 第五章 Locking and Latching
Locks
在单用户系统,LOCKS是不需要的。在多用户系统,为了让多用户访问数据,修改数据,修改数据结构,就需要一个机制来保证大家的一致性修改。该用LOCK的时候就用LOCKLOCKS是一种为了让你正常使用DB的工具,所以并不需要避免它(当然低劣的设计造成的不必要的LOCK应该避免,同时注意在你需要的时候保持LOCK,不需要的时候释放)。在row-Level lockLOCK并不会消耗很多资源,因为你LOCK 1 ROW1W ROWLOCK所需要用的资源都是一样的。READ动作不会被WRITE动作所BLOCKWRITE动作也不会被READ动作所BLOCK
流程类似于
A:发现你要操作的那行数据的地址。
B:去这行。
Clock这行(如果这行已经lock了则等待其释放,除非你用nowait选项)
管理起来非常简单,那是因为lock做为DATA的属性进行管理。

Lock Types

  • DML locks: DML语句产,比如SELECTINSERTUPDATEMERGEDELETE。保证一行只有一个用户操作,并且其他用户不能修改你做操作的表的结构。
DML LOCKS又细分为以下类型

  • TXTransactionLocks
TX lock是开始于一个transaction的第一次改变(关于transaction请看SELECT FOR UPDATE 相关的知识 http://sunmoonking.spaces.live.com/blog/cns!E3BD9CBED01777CA!318.entry),结束于DCL语句。采用一种queue方式以便其他session等待本transaction结束。比如SELECT FOR UPDATE就会产生一个TX locks,
(DBMS_LOCK包测试ORACLE LOCK
http://sunmoonking.spaces.live.com/blog/cns!E3BD9CBED01777CA!590.entry)

  • TM (DML Enqueue) Locks
一般提示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

  • Share DDL locks
其他SESSION不能修改表结构,但是可以修改数据

  • Breakable parse locks:
不会阻止DDL语句

  • Internal locks latches,保护内部数据结构,当ORACLE parse一个query,然后产生一个optimized query plan,它就会latch一块library cache来存放plan以便让其他session也可以用。(可能有人不同意把latch归到LOCK里,求同存异吧),PMON负责清理dies latch
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.10563,883 25,232  0/0
2 74/0.78 11/0.201,126,006 50,367 406/1
3  155/1.13 29/0.371,712,280 75,541  2,830/4
4 272/1.50 44/0.452,298,179 100,682  9,400/5
5  370/2.03 64/0.622,920,219 125,933 13,800/20
6  466/2.58 74/0.72  3,526,704 150,95730,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 TABLEDDL);获得一个TX LOCK来表示那些数据是我们OWN的;DDL LOCK用来在我们自己改变OBJECT的时候保护OBJECTS不被其他人改变,那我们如何主动利用LOCK呢?
SELECT...FOR UPDATE是最常用的一种,通常用来实现某种商业规则(SELECT FOR UPDATE 相关的知识
http://sunmoonking.spaces.live.com/blog/cns!E3BD9CBED01777CA!318.entry
LOCK TABLE IN EXCLUSIVE MODE,用在你需要大批量做更新,而又不希望别人BLOCK你.
用户自定义的LOCK请参考DBMS_LOCK包测试ORACLE LOCK
http://sunmoonking.spaces.live.com/blog/cns!E3BD9CBED01777CA!590.entry

· 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.

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-249667-1-1.html 上篇帖子: 原创 oracle 数据完整性总结(十) 下篇帖子: Oracle数据性能优化的若干诀窍
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表