DeadLock

http://blog.sina.com.cn/s/blog_5384afff0100rtcg.html


DeadLock


Step 1
create table t1 and t2
create table t1 (a int);
create table t2 (a int);


Step 2
insert values
insert into t1 values (1);
insert into t2 values (2);


Step 3
update t1 and t2 value as 1000 and 2000 and not commit in first session and second session
session1
update t1 set a = 1000 where a = 1;   (not commit)


session2
update t2 set a = 2000 where a = 2;   (not commit)


Step 4
to session 1 update table t2 same value,then find lock_wait(because session 2 has been execute the action,the line
has been locked !!)
session1
update t2 set a = 2000 where a = 2; 


Solution:
First Check 
sys@ORCL>@lock.sql


lock                      lock
holder                  holder            lock                                lock   request               blocked
username            session id    SERIAL# type           id1         id2      mode      mode      BLOCK session id
------------------ ----------- ---------- ------ ----------- ----------- --------- --------- ---------- ----------
USER1                        6          7 AE             100           0         4         0          0
USER1                      123         51 AE             100           0         4         0          0
USER1                      123         51 TM           86646           0         3         0          0
USER1                      123         51 TM           86645           0         3         0          0
USER1                      123         51 TX          589831        1179         6         0          0
USER1                      364         53 AE             100           0         4         0          0
USER1                      365         47 AE             100           0         4         0          0
USER1                      365         47 TM           86646           0         3         0          0
USER1                      365         47 TX           65547        1183         6         0          1        123
SYS                        124        319 AE             100           0         4         0          0
                             3          1 CF               0           0         2         0          0
                             3          1 RD               1           0         1         0          0
                             3          1 RS              25           1         2         0          0
                             3          1 XR               4           0         1         0          0
                           121          1 TS               3           1         3         0          0
                           121          1 TS               8           1         3         0          0
                           239          1 PW               1           0         3         0          0
                           357          1 KD               0           0         6         0          0
                           357          1 KT           12876           0         4         0          0
                           358          1 RT               1           0         6         0          0
                           359          1 AE             100           0         4         0          0


已选择21行。


sys@ORCL>


througth the output,we can find the lock wait session is 123.


then we check v$session
sys@ORCL>select sid,serial#,TERMINAL,PROGRAM from v$session where TERMINAL <> 'UNKNOWN';


       SID    SERIAL# TERMINAL                       PROGRAM
---------- ---------- ------------------------------ ------------------------------------------------
         6          7 0101—PC                 plsqldev.exe
       123         51 pts/2                   [email protected] (TNS V1-V3)
       124        319 pts/4                   [email protected] (TNS V1-V3)
       364         53 0101—PC                 plsqldev.exe
       365         47 0101—PC                 plsqldev.exe


sys@ORCL>


finaly:
alter system kill session '123,51';


the lock wait session 2 has been killed:
USER1@ORCL>update t2 set a = 2000 where a = 2;
ERROR:
ORA-03114: 未连接到 ORACLE




update t2 set a = 2000 where a = 2
       *
第 1 行出现错误:
ORA-00028: your session has been killed
ORA-00028: your session has been killed




USER1@ORCL>








@lock.sql


set pages 1000 lin 126
col kaddr heading 'lock|address'
col username heading 'lock|holder|username' for a18
col sid heading 'lock|holder|session id' format 9999999999
col type heading 'lock|type' format a6
col id1 heading 'id1' format 9999999999
col id2 heading 'id2' format 9999999999
col lmode heading 'lock|mode' format 99999999
col request heading 'request|mode' format 99999999
col blocking_sid format 999999 heading 'blocked|session id'
select /*+rule*/
--     a.kaddr, --
     (select username from v$session where sid = a.sid) username,
     a.sid,
     (select serial# from v$session where sid = a.sid) serial#,
--     (select ctime from v$lock where KADDR = a.kaddr) ctime, --
     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
/


column sid clear
column type clear
column request clear
column username clear




你可能感兴趣的:(DeadLock,Oracle,DeadLock)