oracle deadlock

Basic operation

su - oracle

  sqlplus / as sysdba

  show parameter background

  show parameter user_dump_dest

    background_dump_dest: path_to_trace_file

  deadlook error code is: ORA-00060

Refer to dead lock article

      http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1528515465282

one example of dead lock

  

I'm going to hypothesize that there is a unique index on some (at least one) of the columns being 
updated.  

The locks are NOT on a row -- they are due to unique conflicts.  Here is exactly how to simulate 
this:

--------------------- test.sql -------------------------
drop table t;
create table t ( x int primary key );
insert into t values ( 1 );
insert into t values ( 2 );
insert into t values ( 3 );
insert into t values ( 4 );
commit;
update t set x = 5 where x = 1;
REM in another session, run test2.sql
pause
update t set x = 6 where x = 2;
---------------------------------------------------------

-------------------- test2.sql ---------------------------
variable x1 number
variable x2 number
exec :x1 := 6; :x2 := 3;
update t set x = :x1 where x = :x2;
exec :x1 := 5; :x2 := 4;
update t set x = :x1 where x = :x2;
---------------------------------------------------------

Here, session 1 will get the row updated from 1 to 5 -- 5 will be "locked" in the index.

Session 2 will then update 3 to 6 (no conflict, but 6 is "locked" in the index)

Session 2 will then update 4 to 5 -- this'll be a conflict, unique key violation POSSIBLE at this 
point.  Session 2 will block here.

Next, session 1 tries to update 2 to 6 -- that'll be another conflict with session 2, unique key 
violation POSSIBLE at this point.  Session 1 will block and then one of the sessions will get the 
dead lock.

That is when this trace file will be produced:

*** SESSION ID:(8.3883) 2002-08-07 11:09:23.816
DEADLOCK DETECTED
Current SQL statement for this session:
update t set x = :x1 where x = :x2
The following deadlock is not an ORACLE error. It is a
deadlock due to user error in the design of an application
or from issuing incorrect ad-hoc SQL. The following
information may aid in determining the deadlock:
Deadlock graph:
                       ---------Blocker(s)--------  ---------Waiter(s)---------
Resource Name          process session holds waits  process session holds waits
TX-0003003d-000011e2        14       8     X              8       7           S
TX-00020054-0000109e         8       7     X             14       8           S
session 8: DID 0001-000E-00000002   session 7: DID 0001-0008-00000002
session 7: DID 0001-0008-00000002   session 8: DID 0001-000E-00000002
Rows waited on:
Session 7: no row
Session 8: no row
===================================================


So, basically, you have two sessions doing this update (or a similar update) and they are bumping 
into each other with a unique index.  Look for whats unique in this table.

It isn't a row lock issue -- rather, an index key collision that is happening.


Further down in the trace file, you should be seeing something like:


...
Cursor frame allocation dump:
frm: -------- Comment --------  Size  Seg Off
 bind 0: dty=2 mxl=22(22) mal=00 scl=00 pre=00 oacflg=03 oacfl2=0 size=48 offset=0
   bfp=01a70280 bln=22 avl=02 flg=05
   value=5     <<<<<=== the bind variable values
 bind 1: dty=2 mxl=22(22) mal=00 scl=00 pre=00 oacflg=03 oacfl2=0 size=0 offset=24      <<<<<=== 
the bind variable values
   bfp=01a70298 bln=22 avl=02 flg=01
   value=4
End of cursor dump
***************** dump of cursor xsc=1a7681c **********************
........

And that should help you ID where the problem is (you'll see the BR_NO and be able to identify the 
ROWS being modified) 
 
posted on 2013-11-06 14:14  lpthread  阅读(371)  评论(0编辑  收藏  举报