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

[经验分享] Oracle 一次 锁表 处理小记

[复制链接]

尚未签到

发表于 2016-7-29 11:05:36 | 显示全部楼层 |阅读模式
  
  同事说测试库上的一张表被锁了。 不能执行DML 操作。 锁表的准确说法应该是阻塞。之前的一遍blog里有说明:
  锁 死锁 阻塞Latch 等待 详解
  http://blog.csdn.net/tianlesoftware/article/details/5822674
  
  找多锁表的session,并kill 掉之后,对该表的DML 操作正常。 这里在模拟一次这个问题。
  
  开2个session:
  session A:
  SQL>select sid from v$mystat whererownum=1;
  
  SID
  ----------
  137
  
  session B:
  SQL> select sid from v$mystat whererownum=1;
  
  SID
  ----------
  140
  
  session A 更新表T1,不commit:
  SQL>update t1 set object_id=100 where object_id=20;
  2 rows updated.
  
  
  session B 执行同样的操作,测试session B 会挂住:
  SQL> update t1 set object_id=100 whereobject_id=20;
  --在session A commit 之前,一直处于等待状态..
  
  
  查看表上锁的情况:
  SELECT sn.username,
  m.SID,
  sn.SERIAL#,
  m.TYPE,
  DECODE (m.lmode,
  0,
  'None',
  1,
  'Null',
  2,
  'RowShare',
  3,
  'RowExcl.',
  4,
  'Share',
  5,
  'S/RowExcl.',
  6,
  'Exclusive',
  lmode,
  LTRIM (TO_CHAR (lmode, '990')))
  lmode,
  DECODE (m.request,
  0,
  'None',
  1,
  'Null',
  2,
  'RowShare',
  3,
  'RowExcl.',
  4,
  'Share',
  5,
  'S/RowExcl.',
  6,
  'Exclusive',
  request,
  LTRIM (TO_CHAR (m.request, '990')))
  request,
  m.id1,
  m.id2
  FROM v$session sn, v$lock m
  WHERE (sn.SID = m.SID AND m.request != 0) --存在锁请求,即被阻塞
  OR (sn.SID = m.SID --不存在锁请求,但是锁定的对象被其他会话请求锁定
  AND m.request = 0 AND lmode != 4
  AND (id1, id2) IN
  (SELECT s.id1, s.id2
  FROM v$lock s
  WHERErequest != 0
  AND s.id1 = m.id1
  AND s.id2 = m.id2))
  ORDER BY id1, id2, m.request;
DSC0000.gif
  
  这里就显示了锁的信息。 一个DML 操作需要持有2个锁。 一个3级的TM 锁和一个6级的TX锁。 TM 是共享锁,TX 是行级exclusive 锁。
  
  查看v$lock, 可以验证以上锁的信息:
  select * from v$lock where sid in (137,140);
DSC0001.gif
  
  request 是申请锁资源
  block:如果是1,就代表该该SID就持有了一个锁,并且阻塞别人获得这个锁。
  
  2个功能类似的查询SQL:
  
  /* Formatted on2011/8/11 14:18:13 (QP5 v5.163.1008.3004) */
  SELECT p.spid,
  a.sid,
  a.serial#,
  a.state,
  c.object_name,
  b.locked_mode,
  b.session_id,
  b.oracle_username,
  b.os_user_name
  FROM v$process p,
  v$session a,
  v$locked_object b,
  all_objects c
  WHERE p.addr = a.paddr
  AND a.process = b.process
  AND c.object_id = b.object_id;
  
  
  SELECT/*+ rule */
  s .username,
  DECODE (l.TYPE, 'TM', 'TABLE LOCK', 'TX', 'ROW LOCK', NULL)
  LOCK_LEVEL,
  o.owner,
  o.object_name,
  o.object_type,
  s.sid,
  s.serial#,
  s.terminal,
  s.machine,
  s.program,
  s.osuser
  FROM v$session s, v$lock l, dba_objects o
  WHERE l.sid = s.sid AND l.id1 = o.object_id(+) AND s.username IS NOT NULL
  
  
  在session A 提交:
  SQL> commit;
  Commit complete.
  
  session B 完成:
  SQL> update t1 set object_id=100 whereobject_id=20;
  0 rows updated.
  
  阻塞已经结束。 如果找不到对应的session 来进行commit 操作,那就只能kill session了。
  因为我这是测试库,所以也是用kill session来进行的。
  
  SQL>altersystem kill session'sid,serial#';
  
  
  此篇blog 没有什么新东西,里面的内容,以前也整理过了,随便看看,算个笔记吧。
  
  
  
  
  
  -------------------------------------------------------------------------------------------------------
  Blog: http://blog.csdn.net/tianlesoftware
  Weibo: http://weibo.com/tianlesoftware
  Email: dvd.dba@gmail.com
  DBA1 群:62697716(满); DBA2 群:62697977(满)DBA3 群:62697850(满)
  DBA 超级群:63306533(满); DBA4 群: 83829929(满)DBA5群: 142216823(满)
  DBA6 群:158654907(满) 聊天 群:40132017(满) 聊天2群:69087192(满)
  --加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请

运维网声明 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-251128-1-1.html 上篇帖子: (转)oracle触发器----增 删 改 下篇帖子: Oracle 一次 锁表 处理小记
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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