SQ死鎖及死鎖的解決

genweihua發表於2015-11-07
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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章