设为首页 加入收藏

TOP

Oracle锁的模式和10704事件跟踪对比(一)
2017-07-12 10:23:17 】 浏览:702
Tags:Oracle 模式 10704 事件 跟踪 对比

 一、Oracle锁的种类
Oracle里锁分为三大类:
高级队列锁:TM,TX锁等等  视图V$LOCK
中级内存锁:Library cache lock
                  Library cache pin(堆)
                  Row cache lock;
                  Buffer pin lock;
低级内存锁:Latch
                  Mutex
低级内存锁与中级内存锁的区别,主要在于低级内存锁有lock free机制(无锁式编程):即请求latch时,如果该latch不可用,进程会在CPU中等待小段时间(spin)然后重新请求latch。如果依然不可用,该进程会重复以上步骤去请求latch。重复的次数默认值为2000(mutex为500)。如果在重复次数内还是请求不到latch,进程会在v$session_wait中记录latch free等待事件,然后释放cpu,转入睡眠状态。当睡眠一定时间后,进程被唤醒并重复上面的过程,一直到成功获取latch。因此低级内存锁避免了死锁的存在。此外,中级内存锁往往执行多条记录才会释放,而低级内存锁执行几条就可能会释放。


高级队列锁Lock与低级内存锁latch的对比:
1.Lock的种类多,如TM,TX,TT等等;
2.Lock作用于数据库Object,Lacth只作用于SGA内存中;
3.Lock的释放需要等到事务结束,Latch是瞬间的占用和释放;
4.Lock存在死锁,Latch不存在死锁(因free lock机制)


二、Oracle锁的模式
锁模式可分为空锁,共享和独占;又以其行为可分为读锁和写锁:
空  锁:1号锁,空锁,通常只起标志性作用,保证内存不会被释放。
共享锁:2-5号锁,即读锁。包括RS(行共享)、RX(行专用)、S(共享锁)、SRX(共享行专用),允许部分DML操作,数字越大影响的操作越高。
独占锁:6号锁,即写锁。exclusive独立访问使用,是限制最高级别的锁,禁止所有DML操作。


本文主要以跟踪高级队列锁TM和TX为主:
TM锁锁定的是对象,所以叫对象锁,或者表锁,用来阻塞DML(或DDL)的运行,模式上通常1号锁较少,主要持有2,3,4,5,6号锁。
TX锁即事务独占锁,是所有加在行上的锁的总称。模式只有两种,要么无锁(即不持有),要么独占锁(6号);


三、跟踪高级队列锁Lock示例
10704事件可以帮助我们跟踪锁和队列的使用情况,下面先以update为例,用10704事件来观察锁的状态:
sqlplus cheng/oracle
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE 11.2.0.4.0 Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production
SQL> select * from test_t1;
ID NAME
---------- --------------------
1 aaaaaa
2 aaaaaa
3 aaaaaa
4 aaaaaa
5 aaaaaa
6 aaaaaa
7 aaaaaa
8 aaaaaa
9 aaaaaa
10 aaaaaa


10 rows selected.


SQL> alter session set events '10704 trace name context forever, level 12'; --开启10704跟踪
Session altered.
SQL> update test_t1 set NAME='bbbbbb' where id<5;  --更新几条数据
4 rows updated.
SQL> commit;  --提交数据
Commit complete.
SQL> alter session set events '10704 trace name context off'; --关闭10704跟踪
Session altered.


[oracle@localhost ~]$ cd $ORACLE_BASE/diag/rdbms/orcl/orcl/trace/
[oracle@localhost trace]$ more orcl_ora_4992.trc  --提取日志分析


*** 2017-07-05 15:58:46.636
*** ksudidTrace: ksqgtl
ksusesdi:  0000-0000-00000000
ksusetxn:  0001-0015-00000017
ksqgtl: RETURNS 0    --获得游标锁


*** 2017-07-05 15:58:46.639
ksqrcl: CU,bd59a970,0
ksqrcl: returns 0    --释放游标锁


*** 2017-07-05 15:58:46.639
ksqgtl *** TM-00015b7d-00000000 mode=3 flags=0x401 timeout=21474836 ***  --申请持有TM锁(3号)
ksqgtl: xcb=0xbbeb52b8, ktcdix=2147483647, topxcb=0xbbeb52b8
ktcipt(topxcb)=0x0


*** 2017-07-05 15:58:46.639
ksucti: init txn DID from session DID
ksqgtl:
ksqlkdid: 0001-0015-00000017


*** 2017-07-05 15:58:46.639
*** ksudidTrace: ksqgtl
ktcmydid(): 0001-0015-00000017
ksusesdi:  0000-0000-00000000
ksusetxn:  0001-0015-00000017
ksqgtl: RETURNS 0  --获得TM锁


*** 2017-07-05 15:58:46.639
ksqgtl *** TX-00090011-0000058b mode=6 flags=0x401 timeout=0 ***  --申请持有TX锁(6号独占)
ksqgtl: xcb=0xbbeb52b8, ktcdix=2147483647, topxcb=0xbbeb52b8
ktcipt(topxcb)=0x0


*** 2017-07-05 15:58:46.639
ksucti: init sessi

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 1/14/14
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇关于原生JDBC 下一篇Ubuntu 16.04中安装MongoDB3.4数..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目