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

[经验分享] Oracle行级锁的本质

[复制链接]

尚未签到

发表于 2016-7-24 12:43:54 | 显示全部楼层 |阅读模式
   ㈠ 单实例Oracle locking机制

locking机制的三大组成部分:

① resource structure

Oracle对于每个需要“并发访问”的资源,都在SGA中用一个数据结构来描述它
这个结构叫resource structure
这个数据结构有三个成员:owner、waiter和converter
这是3个指针
指向由lock structure组成的链表的指针
DSC0000.png
其中,converter和waiter有些区别:
如果某个操作先后需要两种不同模式的锁,比如,先S,后X,则进程会先请求S,获得后lock structure会挂在owner上,
当需要X时,进行必须先释放S,然后再次申请X
但是可能无法立即获得
这时这个请求会被立即挂在converter下
converter的优先级高于waiter
根据v$lock的lmode和request可以判断他三:
● lmode > 0,request =0 → owner
● lmode = 0,request >0 → waiter
● lmode > 0,request >0 → converter


② lock structure

每当进程要访问共享资源时,必须先锁定该资源
锁定实际就是从SGA中申请一个lock structure
在其中记录lmode 、PID等
然后看能否立刻获得该资源的访问权
● 如果能,则把lock structure挂到resource structure的owner链表中
● 否则,把这个lock structure挂到resource structure的waiter链表中


③ enqueue算法

按先入先出原则分配锁

㈡ 行级锁

以上的locking机制需要resource、lock两种数据结构,适合粗粒度资源,但对于数据记录等细粒度的访问,无论从
内存需求还是维护成本,都是一个恶梦
Oracle的行级锁就是在这种场合下闪亮登场的
行级锁不是Oracle一般意义上的锁
虽然有锁的功能,但是没有锁的开销
行级锁根本没有相关开销,对1千万行锁定所需的资源数与对1行锁定所需的资源数完全相同,这是个常量:0和1
在Oracle的每行数据上,都有一个标志位来表示该行数据是否被锁定,要查看某一行是否被锁定,必须直接找到这一行,
而不要指望能从哪个列表得到答案
我们dump一个数据块,其transaction header的trc文件摘录如下:


Block header dump:  0x01000197
Object id on Block? Y
seg/obj: 0xcd8a  csc: 0x00.a26fe  itc: 2  flg: E  typ: 1 - DATA
brn: 0  bdba: 0x1000191 ver: 0x01 opc: 0
inc: 0  exflg: 0
Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0001.005.00000100  0x0080000f.00ae.23  --U-    1  fsc 0x0000.000a2707
0x02   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000
  
其中 Lck字段就是行级锁的表示:1加锁,0不加锁
data header的部分trc摘录如下:


tab 0, row 0, @0x1f93  
tl: 5 fb: --H-FL-- lb: 0x1  cc: 1   
col  0: [ 1]  61
  
其中 lb => ITL number
其实,lb就是Itl
并发访问时,事务通过这个lb找到Itl,从而确定Lck的值,若为1,则挂到队列池
所以,当用户被阻塞时,不是被某条记录的行级锁阻塞,而是被TX锁阻塞
下面用实验证明之:

   session_A

sys@ORCL> drop table t purge;
Table dropped.
sys@ORCL> create table demo (id number,name varchar2(10));
Table created.
sys@ORCL> insert into demo values(1,'bin');
1 row created.
sys@ORCL> insert into demo values(2,'think');
1 row created.
sys@ORCL> insert into demo values(3,'water');
1 row created.
sys@ORCL> commit;
Commit complete.
sys@ORCL> select * from demo;
ID NAME
---------- ----------
1 bin
2 think
3 water
sys@ORCL> savepoint a;
Savepoint created.
sys@ORCL> update demo set name='think big' where id=2;
1 row updated.

  
session_B
在session_B,并发修改同一条记录,会话被阻塞


sys@ORCL> update demo set name='think big' where id=2;
--被阻塞
  
此时在session_A回滚到之前的savepoint,这相当于撤销了对记录的修改
但是session_B仍然处于等待状态
这是因为session_B是被session_A的TX锁阻塞,而不是被session_A的行级锁阻塞
在session_C上进行查询:


sys@ORCL> select sid,lmode,request from v$lock where sid in (1081,1090);
SID      LMODE    REQUEST
---------- ---------- ----------
1090          0          6
1081          3          0
1090          3          0
1081          6          0
sys@ORCL> select sid,event from v$session where sid in (1081,1090);
SID EVENT
---------- ----------------------------------------------------------------
1081 SQL*Net message from client
1090 enq: TX - row lock contention
  

运维网声明 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-248652-1-1.html 上篇帖子: Oracle创建、修改表和主键自增 下篇帖子: 一个菜鸟的oracle之路-----二
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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