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

[经验分享] Oracle锁实验

[复制链接]

尚未签到

发表于 2018-9-23 09:32:36 | 显示全部楼层 |阅读模式
  MASICONG@orcl> select sid from v$mystat where rownum=1;
  SID
  ----------
  35
  MASICONG@orcl> select sid from v$mystat where rownum=1;
  SID
  ----------
  1
  1.分别模拟insert,update和delete造成阻塞的示例,并对v$lock中的相应的信息进行说明,给出SQL演示。
  MASICONG@orcl> create table test (id varchar(2) primary key);
  Table created.
  INsert阻塞
  MASICONG@orcl> insert into test values (10);
  1 row created.
  MASICONG@orcl> insert into test values(10);  另一个用户提交同样的请求就会卡住
  MASICONG@orcl>  select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') ;
  SID TY        ID1        ID2      LMODE    REQUEST      BLOCK
  ---------- -- ---------- ---------- ---------- ---------- ----------
  1 TX     131090        674          0          4          0
  35 TM      74571          0          3          0          0
  1 TM      74571          0          3          0          0
  1 TX      65540        508          6          0          0
  35 TX     131090        674          6          0          1
  说明1会话需要一个4级锁,但是35已经加了一个6级的锁阻塞了会话。因为会话1已经插入了一条记录,所以又一个TX锁可以通过。
  MASICONG@orcl> select object_name from dba_objects where object_id=74571;
  OBJECT_NAME
  --------------------------------------------------------------------------------
  TEST
  通过TM知道目前是在一个表上加的锁,所有通过ID可以查到具体操作的是哪个表。
  MASICONG@orcl> commit;
  Commit complete.
  MASICONG@orcl> insert into test values(10); 当一个会话提交后,另一个会话才能访问
  *
  ERROR at line 1:
  ORA-00001: unique constraint (MASICONG.SYS_C0011055) violated
  Update阻塞
  MASICONG@orcl> commit
  2  ;
  Commit complete.
  MASICONG@orcl> select * from test;
  ID
  --
  1
  10

  MASICONG@orcl> update test set>  1 row updated.

  MASICONG@orcl> update test set>  MASICONG@orcl>  select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') ;
  SID TY        ID1        ID2      LMODE    REQUEST      BLOCK
  ---------- -- ---------- ---------- ---------- ---------- ----------
  1 TX     458775        552          0          6          0
  1 TM      74571          0          3          0          0
  35 TM      74571          0          3          0          0
  35 TX     458775        552          6          0          1
  显示出现了阻塞信息,会话在等待一个6级的锁
  MASICONG@orcl> select sid,event from v$session_wait where sid in (1,35);
  SID EVENT
  ---------- ----------------------------------------------------------------
  1 enq: TX - row lock contention
  35 SQL*Net message from client
  上面标示1会话需要TX锁
  DELETE操作

  MASICONG@orcl> delete from test where>  1 row deleted.
  MASICONG@orcl> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') ;
  SID TY        ID1        ID2      LMODE    REQUEST      BLOCK
  ---------- -- ---------- ---------- ---------- ---------- ----------
  1 TX     524289        908          0          6          0
  35 TM      74571          0          3          0          0
  1 TM      74571          0          3          0          0
  35 TX     524289        908          6          0          1
  说明1会话需要一个6级别的锁,但是被35会话的6级别的锁所阻塞。
  2.模拟RI锁定导致阻塞的场景,并分析v$lock相应的锁定信息,给出SQL演示。
  MASICONG@orcl> create table zhu (id number primary key);
  Table created.
  MASICONG@orcl> create table cong (id references zhu(id));
  Table created.
  MASICONG@orcl> insert into zhu values (1);
  1 row created.
  MASICONG@orcl> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') order by 1,2;
  SID TY        ID1        ID2      LMODE    REQUEST      BLOCK
  ---------- -- ---------- ---------- ---------- ---------- ----------
  35 TM      74573          0          3          0          0
  35 TM      74575          0          3          0          0
  35 TX     131087        676          6          0          0
  这时候已经在主表和从表上都加了一个3级锁防止DDL操作,同时加了一个6级锁,防止DML操作。
  MASICONG@orcl> insert into zhu values (1);  另一个会话也执行就会造成阻塞。
  MASICONG@orcl> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') order by 1,2;
  SID TY        ID1        ID2      LMODE    REQUEST      BLOCK
  ---------- -- ---------- ---------- ---------- ---------- ----------
  1 TM      74573          0          3          0          0
  1 TM      74575          0          3          0          0
  1 TX     262165        551          0          4          0
  1 TX     589835        690          6          0          0
  35 TM      74575          0          3          0          0
  35 TM      74573          0          3          0          0
  35 TX     262165        551          6          0          1
  上面的实例说明有一行TX加了6级的锁没有阻塞,已经成功执行。主从表都加了3级的表锁。有一个因为要加一个4级锁而别6级锁阻塞,造成了等待。

  MASICONG@orcl> update zhu set>  1 row updated.
  MASICONG@orcl> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') order by 1,2;
  SID TY        ID1        ID2      LMODE    REQUEST      BLOCK
  ---------- -- ---------- ---------- ---------- ---------- ----------
  35 TM      74573          0          3          0          0
  35 TX     327699        721          6          0          0
  当更新主表的记录时候,只对主表上加了TM锁和TX锁。

  MASICONG@orcl> delete from zhu where>  1 row deleted.
  MASICONG@orcl> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') order by 1,2;
  SID TY        ID1        ID2      LMODE    REQUEST      BLOCK
  ---------- -- ---------- ---------- ---------- ---------- ----------
  35 TM      74573          0          3          0          0
  35 TX     393248        700          6          0          0
  当删除主表内容时,只对主表加上了TM锁和TX锁
  MASICONG@orcl> insert into zhu  values (10);
  1 row created.
  MASICONG@orcl> insert into cong values (10);
  1 row created.
  MASICONG@orcl> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') order by 1,2;
  SID TY        ID1        ID2      LMODE    REQUEST      BLOCK
  ---------- -- ---------- ---------- ---------- ---------- ----------
  35 TM      74573          0          3          0          0
  35 TM      74575          0          3          0          0
  35 TX     393244        700          6          0          0
  当从表插入的时候主表和从表都有3级的表锁还有一个6级的TX锁。

  ASICONG@orcl> delete from cong where>  1 row deleted.
  MASICONG@orcl> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') order by 1,2;
  SID TY        ID1        ID2      LMODE    REQUEST      BLOCK
  ---------- -- ---------- ---------- ---------- ---------- ----------
  35 TM      74573          0          3          0          0
  35 TM      74575          0          3          0          0
  35 TX     262165        551          6          0          0
  当从表删除时,主表也有一个3级的锁在上面。
  5.给出一个导致死锁的SQL示例。
  场景:当同一张表,有两个会话,一个23,一个35,当23会话对表进行插入操作,插入数据1,35会话对表进行操作,插入数据2。之后23由对数据插入2,35会话插入数据1,就会造成阻塞,最后产生死锁。
  MASICONG@orcl> select sid from v$mystat where rownum =1 ;
  SID
  ----------
  23
  MASICONG@orcl> insert into test values (1);
  1 row created.
  MASICONG@orcl> insert into test values (2);
  insert into test values (2)
  *
  ERROR at line 1:
  ORA-00060: deadlock detected while waiting for resource
  MASICONG@orcl>  select sid from v$mystat where rownum =1 ;
  SID
  ----------
  37
  MASICONG@orcl> insert into test values (2);
  1 row created.
  MASICONG@orcl> insert into test values (1);
  insert into test values (1)
  *
  ERROR at line 1:
  ORA-01013: user requested cancel of current operation


运维网声明 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.iyunv.com/thread-600142-1-1.html 上篇帖子: Implement Oracle snapshot database with Dataguard-ylw6006 下篇帖子: ORACLE实例RENAME,DB_LINK同步(Materialized View,Snapshot)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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