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

[经验分享] oracle 死锁和锁等待的区别(转载)

[复制链接]
YunVN网友  发表于 2016-8-14 07:35:41 |阅读模式
oracle 死锁和锁等待的区别(转载)

所谓的锁等待:就是一个事务a对一个数据表进行ddl或是dml操作时,系统就会对该表加上表级的排它锁,此时其他的事务对该表进行操作的时候会等待a提交或是回滚后,才可以继续b的操作

所谓的死锁:当两个或多个用户相互等待锁定的数据时就会发生死锁,这时这些用户被卡在不能继续处理业务,oracle可以自动检测死锁并解决他们,通过回滚一个死锁中的语句,释放锁定的数据,回滚的话会遇到ora-00060 deadlock detected while waiting for resource

模拟锁等待:

   两个事务a和b,分别创建t1,t2,并且初始化一条数据,

   a 更改t1的数据,此时并不提交,这时候b更改相同的一列,此时b一直处于等待的状态

我们可以查询锁等待的内容:

wait_lock.sql

select
      (select username from v$session where sid = a.sid) username,
      a.sid,
      (select serial# from v$session where sid = a.sid) serial#,
      a.type,
      a.id1,
      a.id2,
      a.lmode,
      a.request,
      a.block,
      b.sid blocking_sid
from v$lock a,
      ( select * from v$lock
        where request > 0
        and type <> 'MR'
      ) b
where a.id1 = b.id1(+)
   and a.id2 = b.id2(+)
   and a.lmode > 0
   and a.type <> 'MR'
order by username,a.sid,serial#,a.type

此时可以查询到锁等待的现象,最后一列不为空的就是等待的事件

此时我们可以跟a用户提示让其提交事务或是回滚,也可以直接杀死

alter system kill session 'sid,serial#';

保持现状不动,在a事务更改t2表此时在a事务会产生

SQL> update t1 set id=1000 where id=1;
update t1 set id=1000 where id=1
        *
第 1 行出现错误:
ORA-00060: 等待资源时检测到死锁

此时oracle已经帮我解决了这个死锁问题

死锁的产生需要四个必须的条件:

1 ,mutual execution(互斥)资源不能被共享,只能由一个进程使用

2,hold and wait(请求并持续)已经得到资源的进程可以再次申请新的资源

3,no pre-emption(不可剥夺)已经分配的资源不能被相应的进程强制剥夺

4,circular wait(循环等待条件)系统中若干进程组成环路,该环路中的每个进程都在等待相邻进程正占用的资源

定位死锁:

  系统级别的定位

    Select username,lockwait,status,machine,program from v$session where sid in (select session_id from v$locked_object)

      Username死锁的用户,lockwait死锁的状态,status中active表示死锁,machine死锁所在的机器,program死锁来自于那个程序

   语句级别的定位

      Select sql_text from v$sql where hash_value in (select sql_hash_value from v$session where sid in (select session_id from v$locked_object));

  进程级别的定位

   Select s.username,l.object_id,l.session_id,s.serial#,l.oracle_usrename,l.os_user_name,l.process from v$locked_object l,v$session s where l.session_id=s.sid;

处理死锁的一般策略

   1,鸵鸟算法忽略该问题

   2,定位死锁并且恢复

  3,仔细对资源进行动态分配,避免死锁

   4,破坏死锁中的一个条件

如果oracle解决不了的死锁,我们需要定位到进程级别,找到对应的sid和serial#

alter system kill 'sid,serail#'

失败的话,找到对应的进程强制关闭

Select p.spid from v$session s, v$process p where s.sid=xx and s.paddr=p.addr

ps -ef | grep spid

kill -9 xx



查询oracle的死锁

lock.sql

SELECT    bs.username "Blocking User", bs.username "DB User",
           ws.username "Waiting User", bs.SID "SID", ws.SID "WSID",
           bs.serial# "Serial#", bs.sql_address "address",
           bs.sql_hash_value "Sql hash", bs.program "Blocking App",
           ws.program "Waiting App", bs.machine "Blocking Machine",
           ws.machine "Waiting Machine", bs.osuser "Blocking OS User",
           ws.osuser "Waiting OS User", bs.serial# "Serial#",
           ws.serial# "WSerial#",
           DECODE (wk.TYPE,
                   'MR', 'Media Recovery',
                   'RT', 'Redo Thread',
                   'UN', 'USER Name',
                   'TX', 'Transaction',
                   'TM', 'DML',
                   'UL', 'PL/SQL USER LOCK',
                   'DX', 'Distributed Xaction',
                   'CF', 'Control FILE',
                   'IS', 'Instance State',
                   'FS', 'FILE SET',
                   'IR', 'Instance Recovery',
                   'ST', 'Disk SPACE Transaction',
                   'TS', 'Temp Segment',
                   'IV', 'Library Cache Invalidation',
                   'LS', 'LOG START OR Switch',
                   'RW', 'ROW Wait',
                   'SQ', 'Sequence Number',
                   'TE', 'Extend TABLE',
                   'TT', 'Temp TABLE',
                   wk.TYPE
                  ) lock_type,
           DECODE (hk.lmode,
                   0, 'None',
                   1, 'NULL',
                   2, 'ROW-S (SS)',
                   3, 'ROW-X (SX)',
                   4, 'SHARE',
                   5, 'S/ROW-X (SSX)',
                   6, 'EXCLUSIVE',
                   TO_CHAR (hk.lmode)
                  ) mode_held,
           DECODE (wk.request,
                   0, 'None',
                   1, 'NULL',
                   2, 'ROW-S (SS)',
                   3, 'ROW-X (SX)',
                   4, 'SHARE',
                   5, 'S/ROW-X (SSX)',
                   6, 'EXCLUSIVE',
                   TO_CHAR (wk.request)
                  ) mode_requested,
           TO_CHAR (hk.id1) lock_id1, TO_CHAR (hk.id2) lock_id2,
           DECODE
              (hk.BLOCK,
               0, 'NOT Blocking',          /**//* Not blocking any other processes */
               1, 'Blocking',              /**//* This lock blocks other processes */
               2, 'Global',           /**//* This lock is global, so we can't tell */
               TO_CHAR (hk.BLOCK)
              ) blocking_others
      FROM v$lock hk, v$session bs, v$lock wk, v$session ws
     WHERE hk.BLOCK = 1
       AND hk.lmode != 0
       AND hk.lmode != 1
       AND wk.request != 0
       AND wk.TYPE(+) = hk.TYPE
       AND wk.id1(+) = hk.id1
       AND wk.id2(+) = hk.id2
       AND hk.SID = bs.SID(+)
       AND wk.SID = ws.SID(+)
       AND (bs.username IS NOT NULL)
       AND (bs.username <> 'SYSTEM')
       AND (bs.username <> 'SYS')
ORDER BY 1;

这些语句的执行最好是在plsql或是sqldeveloper如果是直接在数据库里面执行的需要格式化表,否则会很让你眼花的。

运维网声明 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-257586-1-1.html 上篇帖子: Oracle Database 中 关于 null值的存储 下篇帖子: oracle 性能调优之 操作系统调优
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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