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

[经验分享] ORACLE 中的lock 机制

[复制链接]

尚未签到

发表于 2016-7-19 07:29:01 | 显示全部楼层 |阅读模式
  
为了进行LOCK的探究,我建立了一个测试表 test ,结构和测试数据如下:
SQL> select * from test;
  ID NAME
---------- ----------
6 yoxi
2 robinson
2 tttt
3 david
4 jason
5 lucy
1 test
  已选择7行。
  row share(行共享)如果对某个表执行了row share锁定,那么,其他的SESSION就不能针对该表执行排他(exclusive)锁定,但是可以执行其他任意锁定。也就是说某个session对该表执行了row share锁定,那么其他session除了drop 命令不能执行,其他dml都可执行。
session 1中:
SQL> lock table test in row share mode;
表已锁定。
session 2中:
SQL> lock table test in row share mode;
表已锁定。
SQL> commit;
提交完成。
SQL> lock table test in row exclusive mode;
表已锁定。
SQL> commit;
提交完成。
SQL> lock table test in share mode;
表已锁定。
SQL> commit;
提交完成
SQL> lock table test in exclusive mode nowait;
lock table test in exclusive mode nowait
*
第 1 行出现错误:
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源
SQL> update test set id=10;
已更新7行。
SQL> rollback;
回退已完成。
SQL> drop table test;
drop table test
*
第 1 行出现错误:
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源 //其实drop table 命令会对表进行exclusive 锁定
row exclusive(行排他) 当执行insert,update,delete就会获得一个行排他锁,这个锁具有row share的所有特征,如果一个session获得了一个row exclusive 锁,那么另外的session 就不能对该表进行exclusive锁定,也不能对该表进行share锁定,可以对该表进行dml操作,但是不能drop;
  session 1中
SQL> lock table test in row exclusive mode;
表已锁定。
session 2中:
SQL> lock table test in row share mode;
表已锁定。
SQL> commit;
提交完成。
SQL> lock table test in row exclusive mode;
表已锁定。
SQL> commit;
提交完成。
SQL> lock table test in share mode nowait;
lock table test in share mode nowait
*
第 1 行出现错误:
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源
SQL> lock table test in exclusive mode nowait;
lock table test in exclusive mode nowait
*
第 1 行出现错误:
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源
  share(共享锁) 当一个session对某个表进行了share锁定,那么其他的session就不能以exclusive ,row exclusive 方式锁定该表,也就是说,如果不能row exclusive的话,就不能进行insert,update ,delete 操作,不能获得exclusive锁定就不能进行drop操作。
session 1中
SQL> lock table test in share mode;
表已锁定。
session 2中
SQL> lock table test in row share mode;
表已锁定。
SQL> lock table test in row exclusive mode nowait;
lock table test in row exclusive mode nowait
*
第 1 行出现错误:
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源
SQL> lock table test in share mode;
表已锁定。
SQL> commit;
提交完成。
SQL> lock table test in exclusive mode nowait;
lock table test in exclusive mode nowait
*
第 1 行出现错误:
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源
  exclusive(排它锁)当执行drop命令,就会产生一个排它锁。顾名思义,只要某个session 对某个表进行了exclusive 锁定,那么其他session就不能对该表进行任何锁定。
session 1中
SQL> lock table test in exclusive mode;
表已锁定。
session 2中
SQL> lock table test in row share mode nowait;
lock table test in row share mode nowait
*
第 1 行出现错误:
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源
其他锁定就不用测试了,因为 row share都不能获得 其他锁定就更不能获得了
  share row exclusive(共享行排他)如果某个session获得了一个share row exclusive锁定,那么其他session就只能获得对该表的row share锁定,也就是说其他session不能对该表进行 insert ,update,delete,drop 操作.row share 锁定 除了防止drop 一无是处 ....
session 1中
SQL> lock table test in share row exclusive mode;
表已锁定。
session 2中
SQL> lock table test in row share mode nowait;
表已锁定。
SQL> commit;
提交完成。
SQL> lock table test in row exclusive mode nowait;
lock table test in row exclusive mode nowait
*
第 1 行出现错误:
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源
SQL> lock table test in share mode nowait;
lock table test in share mode nowait
*
第 1 行出现错误:
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源
SQL> lock table test in exclusive mode nowait;
lock table test in exclusive mode nowait
*
第 1 行出现错误:
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源
  总结一下:
  1.如果一个table 被一个session锁定,无论什么锁定,另外的session就不能获得对于该表exclusive的锁定,也就是说不能删除该表,其实很容易相同,别人在用那个表,你去把表给删除了,肯定是不允许的.
  2.如果能够对某个表进行row exclusive 锁定,那么肯定可以执行dml操作
  3.可以这样理解share锁,顾名思义,共享锁是用来共享的,既然是共享,所以其他用户只能查看,不能更改。
  4.可以这样理解exclusive锁,顾名思义,排它锁就是独享的,其他用户只能查看,不能修改。
  
  注意 :上面通过lock 命令的lock 只能获得 TM(表) lock
  而通过 update ,delete ,insert 产生的lock 有两种,一种是TM lock,一种是TX lock, tx lock 是事务锁的意思
   select........... for update也会得到一个TX lock 以及一个 row exclusive lock
  

运维网声明 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-246012-1-1.html 上篇帖子: oracle 使用自增列 下篇帖子: 还原ORACLE DUMP 的值
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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