ITPub博客

首页 > 数据库 > Oracle > SQ死锁及死锁的解决

SQ死锁及死锁的解决

原创 Oracle 作者:genweihua 时间:2015-11-07 17:40:47 0 删除 编辑
1、模拟死锁的场景:
      登录sqlplus,如下输入命令不提交。

点击(此处)折叠或打开

  1. C:\Windows\System32>sqlplus /nolog

  2. SQL*Plus: Release 12.1.0.1.0 Production on 星期六 11月 7 16:02:00 20

  3. Copyright (c) 1982, 2013, Oracle. All rights reserved.

  4. SQL> conn / as sysdba
  5. 已连接。
  6. SQL> conn scott/windows
  7. 已连接。
  8. SQL> delete from emp;

  9. 已删除 12 行。

  10. SQL>
2、在打开一个sqlplus,如下输入命令:

点击(此处)折叠或打开

  1. Microsoft Windows [版本 6.1.7601]
  2. 版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

  3. C:\Windows\System32>sqlplus /nolog

  4. SQL*Plus: Release 12.1.0.1.0 Production on 星期六 11月 7 16:55:03 2015

  5. Copyright (c) 1982, 2013, Oracle. All rights reserved.

  6. SQL> conn scott/windows
  7. 已连接。
  8. SQL> delete from emp;
此时在PL/SQL Developer中输入一下命令,查询出来锁。

点击(此处)折叠或打开

  1. select /*+ RULE */
  2.  ls.osuser os_user_name,
  3.  ls.username user_name,
  4.  decode(ls.type,
  5.         'RW',
  6.         'Row wait enqueue lock',
  7.         'TM',
  8.         'DML enqueue lock',
  9.         'TX',
  10.         'Transaction enqueue lock',
  11.         'UL',
  12.         'User supplied lock') lock_type,
  13.  o.object_name object,
  14.  decode(ls.lmode,
  15.          1,
  16.          null,
  17.          2,
  18.          'Row Share',
  19.          3,
  20.          'Row
  21. Exclusive',
  22.          4,
  23.          'Share',
  24.          5,
  25.          'Share Row Exclusive',
  26.          6,
  27.          'Exclusive',
  28.          null) lock_mode,
  29.  o.owner,
  30.  ls.sid,
  31.  ls.serial# serial_num,
  32.  ls.id1,
  33.  ls.id2
  34.   from sys.dba_objects o,
  35.        (select s.osuser,
  36.                s.username,
  37.                l.type,
  38.                l.lmode,
  39.                s.sid,
  40.                s.serial#,
  41.                l.id1,
  42.                l.id2
  43.           from v$session s, v$lock l
  44.          where s.sid = l.sid) ls
  45.  where o.object_id = ls.id1
  46.    and o.owner <> 'SYS'
  47.  order by o.owner, o.object_name;
然后输入以下命令,查询出来sid和serial#:

点击(此处)折叠或打开

  1. SELECT /*+ rule */
  2.  lpad(' ', decode(l.xidusn, 0, 3, 0)) || l.oracle_username User_name,
  3.  o.owner,
  4.  o.object_name,
  5.  o.object_type,
  6.  s.sid,
  7.  s.serial#
  8.   FROM v$locked_object l, dba_objects o, v$session s
  9.  WHERE l.object_id = o.object_id
  10.    AND l.session_id = s.sid
  11.  ORDER BY o.object_id, xidusn DESC
然后输入以下命令,杀死死锁:alter system kill session ‘sid,serial#’

点击(此处)折叠或打开

  1. Microsoft Windows [版本 6.1.7601]
  2. 版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

  3. C:\Windows\System32>sqlplus /nolog

  4. SQL*Plus: Release 12.1.0.1.0 Production on 星期六 11月 7 17:43:49 2015

  5. Copyright (c) 1982, 2013, Oracle. All rights reserved.

  6. SQL> conn / as sysdba
  7. 已连接。
  8. SQL> alter system kill session '129,17';

  9. 系统已更改。

  10. SQL> alter system kill session '134,71';

  11. 系统已更改。

  12. SQL>
杀死完成后,再回头看看,刚才锁住的sql,如下所示:


点击(此处)折叠或打开

  1. Microsoft Windows [版本 6.1.7601]
  2. 版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

  3. C:\Windows\System32>sqlplus /nolog

  4. SQL*Plus: Release 12.1.0.1.0 Production on 星期六 11月 7 16:55:03 2015

  5. Copyright (c) 1982, 2013, Oracle. All rights reserved.

  6. SQL> conn scott/windows
  7. 已连接。
  8. SQL> delete from emp;

  9. 已删除 12 行。

  10. SQL>
已经执行完成了!





来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22275400/viewspace-1825262/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-08-28

  • 博文量
    111
  • 访问量
    559046