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

[经验分享] 理解oracle中的行级锁

[复制链接]

尚未签到

发表于 2016-7-30 18:16:07 | 显示全部楼层 |阅读模式
首先来复习一下行级锁的机制。当一个事务开始时必选先申请一个TX锁(保护回滚段、回滚数据块),只有先申请到回滚段资源后才能开始一个事务,才能进行DML操作。这个动作完成后,事务就可以开始修改数据了。当修改数据表的记录时,遵循以下的操作顺序。
1.获得表的TM锁(保护事务执行过程中其它用户不能修改表结构)
2.在要修改的数据块头部的ITL表中申请一个空闲表项,记录事务号,实际记录的是这个事务要使用的回滚段地址。
3.修改数据块的某条记录时,设置该记录头部的ITL索引指向第2步申请的表项,然后再修改记录内容。修改前需奥在回滚段对记录修改前的记录状态做一个copy。
4.当其它用户想并发修改这条记录时,会根据记录头的ITL索引读取数据块头部ITL表项的内容,查看这个事务是否已经提交。
5.如果没有提交,这个用户会等待前一个用户的TX锁的释放。

从上面的工作机制可以看出,无论一个事务修改多少个表的多少记录,该事务真正需要的只是一个TX锁和每个表的TM锁,内存开销非常小。所谓的行级锁只是数据块头、数据记录头的一些字段。所以ORACLE的行级锁虽然有锁的功能,,但是没有锁的开销。

举例证明一下:
会话1:

SQL> select * from test;
        ID
----------
        12
        16
        18

SQL> savepoint s;
保存点已创建。
SQL> update test set id=19 where id=18;
已更新 1 行。

会话2:
SQL> conn sjh/sjh
已连接。
SQL> update test set id=190 where id=18;

--在等待...

会话1:

SQL> rollback to s;
回退已完成。

--会话2继续等待...

会话3:

SQL> select username,event,sid,blocking_session from v$session where username='S
JH';
USERNAME
------------------------------
EVENT                                                                   SID
---------------------------------------------------------------- ----------
BLOCKING_SESSION
----------------
SJH
enq: TX - row lock contention                                           140
             141
SJH
SQL*Net message from client                                             141
--发现TX竞争。会话2在等待会话1释放TX锁。

会话1:

SQL> rollback;
回退已完成。

会话2:

SQL> update test set id=190 where id=18;
update test set id=190 where id=18
                   *
第 1 行出现错误:
ORA-01438: 值大于为此列指定的允许精度

SQL> desc test;
名称                                      是否为空? 类型
----------------------------------------- -------- ------------
ID                                                 NUMBER(2)
会话3:

SQL> select username,event,sid,blocking_session from v$session where username='S
JH';
USERNAME
------------------------------
EVENT                                                                   SID
---------------------------------------------------------------- ----------
BLOCKING_SESSION
----------------
SJH
SQL*Net message from client                                             140

SJH
SQL*Net message from client                                             141

--等待消失。

运维网声明 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-251374-1-1.html 上篇帖子: Oracle逻辑结构与函数入门 下篇帖子: 整理oracle imp/exp命令参数
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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