oracle死鎖測試與解決
本文不對死鎖做理論性的解釋,只從實驗角度闡述死鎖的現象並提供死鎖的一種解決方案
實驗環境為
[root@192 ~]# uname -a
Linux 192.168.151.141 2.6.18-53.el5 #1 SMP Wed Oct 10 16:34:02 EDT 2007 i686 i686 i386 GNU/Linux
[root@192 ~]# su - oracle
[oracle@192 ~]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Fri Dec 6 11:24:36 2013
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SYS>
切換到test使用者
SYS>conn test
Enter password:
Connected.
TEST>
建表students
create table students (id number,name varchar2(10));
插入資料
TEST>insert into students values(1,'andy');
1 row created.
TEST>insert into students values(2,'wang');
1 row created.
TEST>commit;
Commit complete.
檢視資料
TEST>select * from students;
ID NAME
---------- ----------
1 andy
2 wang
session 1
TEST>update students set name='a' where id=1;
1 row updated.
另開一視窗
session 2
檢視資料
TEST>select * from students;
ID NAME
---------- ----------
1 andy
2 wang
TEST>update students set name='b' where id=2;
1 row updated.
session 1
TEST>update students set name='c' where id=2;
掛起,hange住了
session 2
TEST>update students set name='d' where id=1;
掛起,hange住了
這時看看session 1
update students set name='c' where id=2
*
ERROR at line 1:
ORA-00060: deadlock detected while waiting for resource
說明檢測到死鎖。
如果不做處理,session 2會一直掛起,直到拿到資源為止。
此時,可以將session 1 commit
TEST>commit;
Commit complete.
從session 1的視窗檢視
TEST>select * from students;
ID NAME
---------- ----------
1 a
2 wang
TEST>
結果顯示,session 1 commit後,只提交了對id=1的update,對id=2的update,oracle自動回滾。
看session 2的視窗,id=2的update已經執行了
TEST>update students set name='d' where id=1;
1 row updated.
檢視結果
TEST>select * from students;
ID NAME
---------- ----------
1 d
2 b
session 2的兩條資料都成功執行。因為session 2沒有commit,所以session 1只能讀到undo段中的資料
session 1
TEST>select * from students;
ID NAME
---------- ----------
1 a
2 wang
TEST>
將session 2 commit
session 2
TEST>commit;
Commit complete.
這時檢視session 1,已經和session 2同步了
session 1
TEST>select * from students;
ID NAME
---------- ----------
1 d
2 b
接下來,將說說死鎖的解決
當出現死鎖處理無限等待的時候,DBA要人工進行干預,這時只有付出一點代價了,犧牲一個session來解除死鎖。
1 檢視死鎖狀態
select username,lockwait,status,machine,program from v$session where sid in (select session_id from v$locked_object);
處於ACTIVE狀態,說明有死鎖
2 檢視死鎖語句
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));
3 檢視死鎖session_id,serial#
select s.username,l.object_id,l.session_id,s.serial#,l.oracle_username,l.os_user_name,l.process from v$locked_object l,v$session s where l.session_id=s.sid;
4 kill掉死鎖程式
alter system kill session 'sid,serial#'; (sid=l.session_id)
如果還不行,只有用os命令kill掉spid
檢視死鎖spid
select pro.spid from v$session se,v$process pro where se.sid=l.session_id and se.paddr=pro.addr;
kill -9 spid
透過下面的語句可以準確定位出現死鎖的session id
select username,status,sid,serial# from v$session where sid in (select session_id from v$locked_object);
實驗環境為
[root@192 ~]# uname -a
Linux 192.168.151.141 2.6.18-53.el5 #1 SMP Wed Oct 10 16:34:02 EDT 2007 i686 i686 i386 GNU/Linux
[root@192 ~]# su - oracle
[oracle@192 ~]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Fri Dec 6 11:24:36 2013
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SYS>
切換到test使用者
SYS>conn test
Enter password:
Connected.
TEST>
建表students
create table students (id number,name varchar2(10));
插入資料
TEST>insert into students values(1,'andy');
1 row created.
TEST>insert into students values(2,'wang');
1 row created.
TEST>commit;
Commit complete.
檢視資料
TEST>select * from students;
ID NAME
---------- ----------
1 andy
2 wang
session 1
TEST>update students set name='a' where id=1;
1 row updated.
另開一視窗
session 2
檢視資料
TEST>select * from students;
ID NAME
---------- ----------
1 andy
2 wang
TEST>update students set name='b' where id=2;
1 row updated.
session 1
TEST>update students set name='c' where id=2;
掛起,hange住了
session 2
TEST>update students set name='d' where id=1;
掛起,hange住了
這時看看session 1
update students set name='c' where id=2
*
ERROR at line 1:
ORA-00060: deadlock detected while waiting for resource
說明檢測到死鎖。
如果不做處理,session 2會一直掛起,直到拿到資源為止。
此時,可以將session 1 commit
TEST>commit;
Commit complete.
從session 1的視窗檢視
TEST>select * from students;
ID NAME
---------- ----------
1 a
2 wang
TEST>
結果顯示,session 1 commit後,只提交了對id=1的update,對id=2的update,oracle自動回滾。
看session 2的視窗,id=2的update已經執行了
TEST>update students set name='d' where id=1;
1 row updated.
檢視結果
TEST>select * from students;
ID NAME
---------- ----------
1 d
2 b
session 2的兩條資料都成功執行。因為session 2沒有commit,所以session 1只能讀到undo段中的資料
session 1
TEST>select * from students;
ID NAME
---------- ----------
1 a
2 wang
TEST>
將session 2 commit
session 2
TEST>commit;
Commit complete.
這時檢視session 1,已經和session 2同步了
session 1
TEST>select * from students;
ID NAME
---------- ----------
1 d
2 b
接下來,將說說死鎖的解決
當出現死鎖處理無限等待的時候,DBA要人工進行干預,這時只有付出一點代價了,犧牲一個session來解除死鎖。
1 檢視死鎖狀態
select username,lockwait,status,machine,program from v$session where sid in (select session_id from v$locked_object);
處於ACTIVE狀態,說明有死鎖
2 檢視死鎖語句
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));
3 檢視死鎖session_id,serial#
select s.username,l.object_id,l.session_id,s.serial#,l.oracle_username,l.os_user_name,l.process from v$locked_object l,v$session s where l.session_id=s.sid;
4 kill掉死鎖程式
alter system kill session 'sid,serial#'; (sid=l.session_id)
如果還不行,只有用os命令kill掉spid
檢視死鎖spid
select pro.spid from v$session se,v$process pro where se.sid=l.session_id and se.paddr=pro.addr;
kill -9 spid
透過下面的語句可以準確定位出現死鎖的session id
select username,status,sid,serial# from v$session where sid in (select session_id from v$locked_object);
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27181165/viewspace-1062508/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 解決Oracle死鎖問題步驟Oracle
- MySQL死鎖分析與解決之路MySql
- 面試:什麼是死鎖,如何避免或解決死鎖;MySQL中的死鎖現象,MySQL死鎖如何解決面試MySql
- MySQL 死鎖解決MySql
- MySQL解決死鎖MySql
- 例項詳解 Java 死鎖與破解死鎖Java
- 【Oracle】死鎖的產生與處理Oracle
- 檢視oracle死鎖程式並結束死鎖Oracle
- 什麼是死鎖?如何解決死鎖?
- mysql慢查詢,死鎖解決方案MySql
- oracle鎖級別相關測試Oracle
- JAVA死鎖排查-效能測試問題排查思路Java
- ORA-00060: Deadlock detected 模擬死鎖產生與解決方案
- 面試官:什麼是死鎖?怎麼排查死鎖?怎麼避免死鎖?面試
- Mysql使用kill命令解決死鎖問題MySql
- mysql行鎖和死鎖檢測MySql
- 常見的死鎖情況及解決方法
- 鎖的使用與死鎖的避免
- SQL SERVER死鎖查詢,死鎖分析,解鎖,查詢佔用SQLServer
- Oracle死鎖一例(ORA-00060),鎖表導致的業務死鎖問題Oracle
- 記一次Oracle死鎖/阻塞排查Oracle
- MySQL鎖等待與死鎖問題分析MySql
- LiteOS:SpinLock自旋鎖及LockDep死鎖檢測
- 手把手教你分析解決MySQL死鎖問題MySql
- 作業系統(5) 死鎖的概念 死鎖產生的必要條件 死鎖的處理策略 預防死鎖 避免死鎖 死鎖的檢測和解除 銀行家演算法作業系統演算法
- 解鎖 AB 測試的力量
- 死鎖問題排查過程-間隙鎖的復現以及解決
- oracle 查詢鎖 && 解鎖Oracle
- Oracle查詢鎖、解鎖Oracle
- 故障解析丨一次死鎖問題的解決
- oracle 會話(session)被鎖瞭解決方法Oracle會話Session
- [翻譯]:SQL死鎖-阻塞探測SQL
- MySQL的index merge(索引合併)導致資料庫死鎖分析與解決方案MySqlIndex索引資料庫
- 死鎖
- Java中常見死鎖與活鎖的例項Java
- Python | 淺談併發鎖與死鎖問題Python
- Python | 多執行緒死鎖問題的巧妙解決方法Python執行緒
- 記憶體混亂及解決方法和死鎖問題記憶體
- 死鎖概述