Detect row lock during insert

Hello, is there a way to detect whether another process is inserting same row into same table, at the point of insert?
For eg
create table p1 ( col varchar2(10) );
alter table p1 add constraint p1_pk primary key (col);
Session 1:
Insert into p1 values ('1');
Session 2: (how to detect session 1 is inserting same row, before session 1 commits?)
Insert into p1 values('1');Message was edited by:
MWJ

You could test for a share lock:
SQL> lock table p1 in share mode nowait;
lock table p1 in share mode nowait
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified
SQL> You could catch this exception and do whatever you wanted to do.
But IMHO this is the wrong approach. For me the question is, why session 1 is allowed to wait (how long? forever?) until it commits. The application (i.e. the client, browser applet, <you name it>) should immediately commit. Why to do an insert and then a rollback? Then better do nothing.

Similar Messages

  • Detect Row Locking

    Hi all, I need to write a function that able to check whether the particular record is current updating by some other people. How do i detect it ? Any API ?

    anyone know the solution? thanks a million....

  • Row lock on db2

    we are using db2 udb v8.1, with the type 4 jcc jdbc driver. does anyone know how to create a row lock while i open a resultset? i do select ... from .. where ... for update of ...... is not working. i need to have a row lock while my cursor is move backward or forward in the resultset. thanks

    I'm looking for the answer too....
    anyway i want lock a row and detect row lock... for
    microsoft access....good luck finding this... access doesn't support row locking.

  • Enq: TX - row lock contention-Trace file shared.

    Hi Team,
    I am having enq: TX - row lock contention in top wait event. it is occuring between 10pm - 2am.
    We are having sqlloader job running every one hour(conventional path). But for the specific period of time i am getting "Global Enqueue Services Deadlock detected". Between 10-5. I analyzed realated trace file it is make me little confusion.I found there are four insert query culprit for this locking. out of four sql , tow of them are ran by same SID, other two insert ran by same id. I got confused because how same sid locking them self. trace file below. Please help me on this. during this period oracle maintanence window is active.Thanks
    Trace file:
    *** 2012-10-09 03:40:31.135
    user session for deadlock lock 0x15365e060
    sid: 1104 ser: 22256 audsid: 8797820 user: 49/iurth flags: 0x45
    pid: 71 O/S info: user: oracle, term: UNKNOWN, ospid: 8601
    image: oracle@sgh0909
    client details:
    O/S info: user: user, term: , ospid: 30888
    machine: sgj89909 program: sqlldr@sgj89909 (TNS V1-V3)
    application name: SQL Loader Conventional Path Load, hash value=1935272243
    action name: der/sample.ctl, hash value=3241011749
    current SQL:
    INSERT INTO sample (ID,SU,TIME,PMAN_S,CV_OS,PRD_US,P_DS,PM_LY_DRD_S,PMP_PY_DIDS,PP_S,PMP_RECV_FRMS) VALUES (:NE,:SID,CAST(TO_DATE(:PNG_TE, 'DDMMYYY,PMP_TRAN_FRMS,PMP_RECV_FRMS) VALUES (:NE_ID,:SUB_ID,CAST(TO_DATE(:POLLING_TIME, 'DDMMYYYYHH24MISS') AS DATE),:PMP_TRAN_OCTS,:PMP_RECV_OCTS,:PMP_DISCARD_US,:PMP_DISCARD_DS,:PMP_POLICY_DISCARD_US,:PMP_POLICY_DISCARD_DS,:PMP_TRAN_FRMS,:PMP_RECV_FRMS) ÷     {+  (Cõ{+  (Cõ{+  ð÷         ð÷         ú;6üΠì/'    „P'            û[þ‡»q         hdšÙÿ   –    $µ            +       л{+  XdšÙÿ   cšÙÿ                         л{+                              M                         L                             šÙ     ƒß    @ešÙÿ  ’Ü    cšÙÿ  lcšÙÿ      M „P'       L
    *** 2012-10-09 03:40:31.533
    Short stack dump:
    <-ksedsts()+315<-ksdxfstk()+32<-ksdxcb()+1764<-sspuser()+112<-__restore_rt()<-semtimedop()+10<-sskgpwwait()+265<-skgpwwait()+156<-ksliwat()+1546<-kslwaitctx()+162<-kjusuc()+3868<-ksipgetctx()+1456<-ksqcmi()+22853<-ksqgtlctx()+4311<-ksqgelctx()+601<-ktcwit1()+333<-ktbgtl0()+1321<-kdimod0()+4581<-kdiblLockPiece()+968<-kdiblLockRange()+1639<-kdiblcfls()+189<-kdiblFinish1()+978<-kdibliFinish()+73<-kxibDoFinish()+90<-kxibFinish()+431<-qerltcEndLoadProcessing()+614<-qerltcLoadStateMachine()+858<-qerltcInsertValues()+218<-qerltcFetch()+1373<-insexe()+1095<-opiexe()+5609<-opiodr()+1220<-ttcpip()+1227<-opitsk()+1449<-opiino()+1026<-opiodr()+1220<-opidrv()+580<-sou2o()+90<-opimai_real()+145<-ssthrdmain()+177<-main()+215<-__libc_start_main()+244<-_start()+41
    user session for deadlock lock 0x1537feef8
    sid: 1107 ser: 44863 audsid: 8797823 user: 49/iurth flags: 0x45
    pid: 57 O/S info: user: oracle, term: UNKNOWN, ospid: 4540
    image: oracle@sgh0909
    client details:
    O/S info: user: user, term: , ospid: 7569
    machine: sgj89909 program: sqlldr@sgj89909 (TNS V1-V3)
    application name: SQL Loader Conventional Path Load, hash value=1935272243
    action name: der/sample.ctl, hash value=3241011749
    current SQL:
    INSERT INTO sample (ID,SU,TIME,PMAN_S,CV_OS,PRD_US,P_DS,PM_LY_DRD_S,PMP_PY_DIDS,PP_S,PMP_RECV_FRMS) VALUES (:NE,:SID,CAST(TO_DATE(:PNG_TE, 'DDMMYYY,PMP_TRAN_FRMS,PMP_RECV_FRMS) VALUES (:NE_ID,:SUB_ID,CAST(TO_DATE(:POLLING_TIME, 'DDMMYYYYHH24MISS') AS DATE),:PMP_TRAN_OCTS,:PMP_RECV_OCTS,:PMP_DISCARD_US,:PMP_DISCARD_DS,:PMP_POLICY_DISCARD_US,:PMP_POLICY_DISCARD_DS,:PMP_TRAN_FRMS,:PMP_RECV_FRMS) ÷     {+  (Cõ{+  (Cõ{+  ð÷         ð÷         –R<üΠì/'    „P'                            hdšÙÿ  _ž    $µ            +       л{+  XdšÙÿ   cšÙÿ                         л{+                              M                         L                              šÙ     ƒß    @ešÙÿ  ’Ü    cšÙÿ  lcšÙÿ      M „P'       L
    Short stack dump:
    <-ksedsts()+315<-ksdxfstk()+32<-ksdxcb()+1764<-sspuser()+112<-__restore_rt()<-semtimedop()+10<-sskgpwwait()+265<-skgpwwait()+156<-ksliwat()+1546<-kslwaitctx()+162<-kjusuc()+3868<-ksipgetctx()+1456<-ksqcmi()+22853<-ksqgtlctx()+4311<-ksqgelctx()+601<-ktcwit1()+333<-ktbgtl0()+1321<-kdimod0()+4581<-kdiblLockPiece()+968<-kdiblLockRange()+1639<-kdiblcfls()+189<-kdiblFinish1()+978<-kdibliFinish()+73<-kxibDoFinish()+90<-kxibFinish()+431<-qerltcEndLoadProcessing()+614<-qerltcLoadStateMachine()+858<-qerltcInsertValues()+218<-qerltcFetch()+1373<-insexe()+1095<-opiexe()+5609<-opiodr()+1220<-ttcpip()+1227<-opitsk()+1449<-opiino()+1026<-opiodr()+1220<-opidrv()+580<-sou2o()+90<-opimai_real()+145<-ssthrdmain()+177<-main()+215<-__libc_start_main()+244<-_start()+41
    user session for deadlock lock 0x1528de490
    sid: 1107 ser: 44863 audsid: 8797823 user: 49/iurth flags: 0x45
    pid: 57 O/S info: user: oracle, term: UNKNOWN, ospid: 4540
    image: oracle@sgh0909
    client details:
    O/S info: user: user, term: , ospid: 7569
    machine: sgj89909 program: sqlldr@sgj89909 (TNS V1-V3)
    application name: SQL Loader Conventional Path Load, hash value=1935272243
    action name: der/sample.ctl, hash value=3241011749
    current SQL:
    INSERT INTO sample (ID,SU,TIME,PMAN_S,CV_OS,PRD_US,P_DS,PM_LY_DRD_S,PMP_PY_DIDS,PP_S,PMP_RECV_FRMS) VALUES (:NE,:SID,CAST(TO_DATE(:PNG_TE, 'DDMMYYY,PMP_TRAN_FRMS,PMP_RECV_FRMS) VALUES (:NE_ID,:SUB_ID,CAST(TO_DATE(:POLLING_TIME, 'DDMMYYYYHH24MISS') AS DATE),:PMP_TRAN_OCTS,:PMP_RECV_OCTS,:PMP_DISCARD_US,:PMP_DISCARD_DS,:PMP_POLICY_DISCARD_US,:PMP_POLICY_DISCARD_DS,:PMP_TRAN_FRMS,:PMP_RECV_FRMS) ÷     {+  (Cõ{+  (Cõ{+  ð÷         ð÷         ÍïEüΠì/'    „P'                            hdšÙÿ  €¦    $µ            +       л{+  XdšÙÿ   cšÙÿ                         л{+                              M                         L                              šÙ     ƒß    @ešÙÿ  ’Ü    cšÙÿ  lcšÙÿ      M „P'       L
    *** 2012-10-09 03:40:32.452
    Short stack dump:
    <-ksedsts()+315<-ksdxfstk()+32<-ksdxcb()+1764<-sspuser()+112<-__restore_rt()<-semtimedop()+10<-sskgpwwait()+265<-skgpwwait()+156<-ksliwat()+1546<-kslwaitctx()+162<-kjusuc()+3868<-ksipgetctx()+1456<-ksqcmi()+22853<-ksqgtlctx()+4311<-ksqgelctx()+601<-ktcwit1()+333<-ktbgtl0()+1321<-kdimod0()+4581<-kdiblLockPiece()+968<-kdiblLockRange()+1639<-kdiblcfls()+189<-kdiblFinish1()+978<-kdibliFinish()+73<-kxibDoFinish()+90<-kxibFinish()+431<-qerltcEndLoadProcessing()+614<-qerltcLoadStateMachine()+858<-qerltcInsertValues()+218<-qerltcFetch()+1373<-insexe()+1095<-opiexe()+5609<-opiodr()+1220<-ttcpip()+1227<-opitsk()+1449<-opiino()+1026<-opiodr()+1220<-opidrv()+580<-sou2o()+90<-opimai_real()+145<-ssthrdmain()+177<-main()+215<-__libc_start_main()+244<-_start()+41
    user session for deadlock lock 0x1528de2e0
    sid: 1104 ser: 22256 audsid: 8797820 user: 49/iurth flags: 0x45
    pid: 71 O/S info: user: oracle, term: UNKNOWN, ospid: 8601
    image: oracle@sgh0909
    client details:
    O/S info: user: user, term: , ospid: 30888
    machine: sgj89909 program: sqlldr@sgj89909 (TNS V1-V3)
    application name: SQL Loader Conventional Path Load, hash value=1935272243
    action name: der/sample.ctl, hash value=3241011749
    current SQL:
    INSERT INTO sample (ID,SU,TIME,PMAN_S,CV_OS,PRD_US,P_DS,PM_LY_DRD_S,PMP_PY_DIDS,PP_S,PMP_RECV_FRMS) VALUES (:NE,:SID,CAST(TO_DATE(:PNG_TE, 'DDMMYYY,PMP_TRAN_FRMS,PMP_RECV_FRMS) VALUES (:NE_ID,:SUB_ID,CAST(TO_DATE(:POLLING_TIME, 'DDMMYYYYHH24MISS') AS DATE),:PMP_TRAN_OCTS,:PMP_RECV_OCTS,:PMP_DISCARD_US,:PMP_DISCARD_DS,:PMP_POLICY_DISCARD_US,:PMP_POLICY_DISCARD_DS,:PMP_TRAN_FRMS,:PMP_RECV_FRMS) ÷     {+  (Cõ{+  (Cõ{+  ð÷         ð÷         DlJüΠì/'    „P'                            hdšÙÿ  ¾®    $µ            +       л{+  XdšÙÿ   cšÙÿ                         л{+                              M                         L                              šÙ     ƒß    @ešÙÿ  ’Ü    cšÙÿ  lcšÙÿ      M „P'       L
    Short stack dump:
    <-ksedsts()+315<-ksdxfstk()+32<-ksdxcb()+1764<-sspuser()+112<-__restore_rt()<-semtimedop()+10<-sskgpwwait()+265<-skgpwwait()+156<-ksliwat()+1546<-kslwaitctx()+162<-kjusuc()+3868<-ksipgetctx()+1456<-ksqcmi()+22853<-ksqgtlctx()+4311<-ksqgelctx()+601<-ktcwit1()+333<-ktbgtl0()+1321<-kdimod0()+4581<-kdiblLockPiece()+968<-kdiblLockRange()+1639<-kdiblcfls()+189<-kdiblFinish1()+978<-kdibliFinish()+73<-kxibDoFinish()+90<-kxibFinish()+431<-qerltcEndLoadProcessing()+614<-qerltcLoadStateMachine()+858<-qerltcInsertValues()+218<-qerltcFetch()+1373<-insexe()+1095<-opiexe()+5609<-opiodr()+1220<-ttcpip()+1227<-opitsk()+1449<-opiino()+1026<-opiodr()+1220<-opidrv()+580<-sou2o()+90<-opimai_real()+145<-ssthrdmain()+177<-main()+215<-__libc_start_main()+244<-_start()+41
    Global blockers dump start:---------------------------------
    DUMP LOCAL BLOCKER/HOLDER: block level 3 res [0x2a001d][0x1cb9d],[TX]
    ----------resource 0x1341d3c30----------------------
    resname : [0x2a001d][0x1cb9d],[TX]
    Local node : 4
    dir_node : 4
    master_node : 4
    hv idx : 14
    hv last r.inc : 32
    current inc : 32
    hv status : 0
    hv master : 4
    open options : dd
    grant_bits : KJUSERNL KJUSEREX
    grant mode : KJUSERNL KJUSERCR KJUSERCW KJUSERPR KJUSERPW KJUSEREX
    count : 3 0 0 0 0 1
    val_state : KJUSERVS_NOVALUE
    valblk : 0x5f4f4354532c504d505f524543565f4f OCTS,PMPRECV_O
    access_node : 4
    vbreq_state : 0
    state : x0
    resp : 0x1341d3c30
    On Scan_q? : N
    Total accesses: 8568
    Imm. accesses: 7210
    Granted_locks : 1
    Cvting_locks : 3
    value_block: 5f 4f 43 54 53 2c 50 4d 50 5f 52 45 43 56 5f 4f
    GRANTED_Q :
    lp 0x1537feef8 gl KJUSEREX rp 0x1341d3c30 [0x2a001d][0x1cb9d],[TX]
    master 4 gl owner 0x154b13128 possible pid 4540 xid 39000-0005-00048D1F bast 0 rseq 1329 mseq 0 history 0x14951495
    open opt KJUSERDEADLOCK
    CONVERT_Q:
    lp 0x1537ff0a8 gl KJUSERNL rl KJUSERPR rp 0x1341d3c30 [0x2a001d][0x1cb9d],[TX]
    master 4 gl owner 0x155b0dd28 possible pid 12781 xid 37000-0005-00082EBC bast 0 rseq 1329 mseq 0 history 0x49a5149a
    convert opt KJUSERGETVALUE
    lp 0x1513ef168 gl KJUSERNL rl KJUSERPR rp 0x1341d3c30 [0x2a001d][0x1cb9d],[TX]
    master 4 gl owner 0x159aaf240 possible pid 1347 xid 48000-0005-0001FACA bast 0 rseq 1329 mseq 0 history 0x49a5149a
    convert opt KJUSERGETVALUE
    lp 0x15365e060 gl KJUSERNL rl KJUSERPR rp 0x1341d3c30 [0x2a001d][0x1cb9d],[TX]
    master 4 gl owner 0x154b105e0 possible pid 8601 xid 47000-0005-00024CDE bast 0 rseq 1329 mseq 0 history 0x49a5149a
    convert opt KJUSERGETVALUE
    ----------enqueue 0x1537feef8------------------------
    lock version : 2128337
    Owner node : 4
    grant_level : KJUSEREX
    req_level : KJUSEREX
    bast_level : KJUSERNL
    notify_func : (nil)
    resp : 0x1341d3c30
    procp : 0x1510e0ee0
    pid : 12781
    proc version : 10700
    oprocp : (nil)
    opid : 0
    group lock owner : 0x154b13128
    possible pid : 4540
    xid : 39000-0005-00048D1F
    dd_time : 0.0 secs
    dd_count : 0
    timeout : 0.0 secs
    On_timer_q? : N
    On_dd_q? : N
    lock_state : GRANTED
    Open Options : KJUSERDEADLOCK
    Convert options : KJUSERNOQUEUE KJUSERNODEADLOCKWAIT
    History : 0x14951495
    Msg_Seq : 0x0
    res_seq : 1329
    valblk : 0x2c3a504d505f504f4c4943595f444953 ,:PMP_POLICY_DIS
    DUMP LOCAL BLOCKER: initiate state dump for DEADLOCK
    possible owner[57.4540] on resource TX-002A001D-0001CB9D
    *** 2012-10-09 03:40:32.794
    Submitting asynchronized dump request [28]
    DUMP LOCAL BLOCKER/HOLDER: block level 3 res [0x2f0003][0x1eee9],[TX]
    ----------resource 0x1355e6868----------------------
    resname : [0x2f0003][0x1eee9],[TX]
    Local node : 4
    dir_node : 4
    master_node : 4
    hv idx : 64
    hv last r.inc : 32
    current inc : 32
    hv status : 0
    hv master : 4
    open options : dd
    grant_bits : KJUSERNL KJUSEREX
    grant mode : KJUSERNL KJUSERCR KJUSERCW KJUSERPR KJUSERPW KJUSEREX
    count : 1 0 0 0 0 1
    val_state : KJUSERVS_NOVALUE
    valblk : 0x5f4f4354532c504de00e0e5101000000 _OCTS,PMQ
    access_node : 4
    vbreq_state : 0
    state : x0
    resp : 0x1355e6868
    On Scan_q? : N
    Total accesses: 13955
    Imm. accesses: 11923
    Granted_locks : 1
    Cvting_locks : 1
    value_block: 5f 4f 43 54 53 2c 50 4d e0 0e 0e 51 01 00 00 00
    GRANTED_Q :
    lp 0x1528de2e0 gl KJUSEREX rp 0x1355e6868 [0x2f0003][0x1eee9],[TX]
    master 4 gl owner 0x154b105e0 possible pid 8601 xid 47000-0005-00024CDE bast 0 rseq 1980 mseq 0 history 0x49a51495
    open opt KJUSERDEADLOCK
    CONVERT_Q:
    lp 0x1528de490 gl KJUSERNL rl KJUSERPR rp 0x1355e6868 [0x2f0003][0x1eee9],[TX]
    master 4 gl owner 0x154b13128 possible pid 4540 xid 39000-0005-00048D1F bast 0 rseq 1980 mseq 0 history 0x49a5149a
    convert opt KJUSERGETVALUE
    ----------enqueue 0x1528de2e0------------------------
    lock version : 2643245
    Owner node : 4
    grant_level : KJUSEREX
    req_level : KJUSEREX
    bast_level : KJUSERNL
    notify_func : (nil)
    resp : 0x1355e6868
    procp : 0x1510f9800
    pid : 4540
    proc version : 21634
    oprocp : (nil)
    opid : 0
    group lock owner : 0x154b105e0
    possible pid : 8601
    xid : 47000-0005-00024CDE
    dd_time : 0.0 secs
    dd_count : 0
    timeout : 0.0 secs
    On_timer_q? : N
    On_dd_q? : N
    lock_state : GRANTED
    Open Options : KJUSERDEADLOCK
    Convert options : KJUSERNOQUEUE KJUSERNODEADLOCKWAIT
    History : 0x49a51495
    Msg_Seq : 0x0
    res_seq : 1980
    valblk : 0x2c3a504d505f504f4c4943595f444953 ,:PMP_POLICY_DIS
    DUMP LOCAL BLOCKER: initiate state dump for DEADLOCK
    possible owner[71.8601] on resource TX-002F0003-0001EEE9
    *** 2012-10-09 03:40:32.794
    Submitting asynchronized dump request [28]
    Global blockers dump end:-----------------------------------
    Global Wait-For-Graph(WFG) at ddTS[0.108ea] :
    BLOCKED 0x15365e060 3 wq 2 cvtops x1 TX 0x2a001d.0x1cb9d [47000-0005-00024CDE] 4
    BLOCKER 0x1537feef8 3 wq 1 cvtops x28 TX 0x2a001d.0x1cb9d [39000-0005-00048D1F] 4
    BLOCKED 0x1528de490 3 wq 2 cvtops x1 TX 0x2f0003.0x1eee9 [39000-0005-00048D1F] 4
    BLOCKER 0x1528de2e0 3 wq 1 cvtops x28 TX 0x2f0003.0x1eee9 [47000-0005-00024CDE] 4

    Your scenario involves mode 4 (KJUSERPR) and mode 6 (KJUSEREX) TX locks.
    Mode 4 (S) TX locks can have a few causes, including ITLs, unique indexes and bitmap indexes.
    It could be a very similar scenario to this recent thread where the situation was primary/unique key collisions from inserts on different nodes:
    Re: Cause of Deadlock

  • How to check if row to be inserted will cause circular circular loop?

    Hi-
    I'm using connect by clause to do some processing and to check that the data is not causing circular loops (with SQLCODE = -1436).
    Customers can add data via API, and this data, after inserted, can cause the problem explained above (loop). Therefore I need to find a way to check that these new values don't collide with the existing data in the table.
    One way that currently works is to insert the data, use my pl/sql function to check that there's no loops; if there's a loop, i catch the exception, delete the rows I just inserted, and throw back the error to the user.
    I find it very ugly and unneficient, but I can't find the way to use CONNECT BY with data that is not present in the table. example:
    table my_table contains
    parent_id | child_id
    111 | 777
    777 | 333
    and now customer wants to insert:
    parent_id | child_id
    777 | 111
    Also, if customer wants to insert
    333 | 111
    if I insert the row and run my script, it will work OK, but only if I insert the row. Is there any way to validate this without inserting/removing the row ?
    the script I'm using is similar to the one posted here:
    problems using CONNECT BY
    thanks

    This approach may fail to detect loops introduced by concurrent transactions if one of the transaction uses a serializable isolation level.
    For example, assume there are two sessions (A and B), the table and trigger have been created, and the table is empty. Consider the following scenario.
    First, session A starts a transaction with serializable isolation level:
    A> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    Transaction set.Next, session B inserts a row and commits:
    B> INSERT INTO my_table (parent_id, child_id) VALUES (111, 777);
    1 row created.
    B> COMMIT;
    Commit complete.Now, session A successfully inserts a conflicting row and commits:
    A> INSERT INTO my_table (parent_id, child_id) VALUES (777, 111);
    1 row created.
    A> COMMIT;
    Commit complete.
    A> SELECT * FROM MY_TABLE;
    PARENT_ID  CHILD_ID
          111       777
          777       111Session A "sees" the table "as of" a point in time before session B inserted. Also, once session B commits, the lock it acquired is released.
    An alternative approach that would prevent this could use SELECT...FOR UPDATE and a "table of locks" like this:
    SQL> DROP TABLE MY_TABLE;
    Table dropped.
    SQL> CREATE TABLE MY_TABLE
      2  (
      3      PARENT_ID NUMBER,
      4      CHILD_ID NUMBER
      5  );
    Table created.
    SQL> CREATE TABLE LOCKS
      2  (
      3      LOCK_ID INTEGER PRIMARY KEY
      4  );
    Table created.
    SQL> INSERT INTO LOCKS(LOCK_ID) VALUES(123);
    1 row created.
    SQL> COMMIT;
    Commit complete.
    SQL> CREATE OR REPLACE TRIGGER MY_TABLE_AI
      2      AFTER INSERT ON my_table
      3  DECLARE
      4      v_count NUMBER;
      5      v_lock_id INTEGER;
      6  BEGIN
      7      SELECT
      8          LOCK_ID
      9      INTO
    10          v_lock_id
    11      FROM
    12          LOCKS
    13      WHERE
    14          LOCKS.LOCK_ID = 123
    15      FOR UPDATE;
    16         
    17      SELECT
    18          COUNT (*)
    19      INTO  
    20          v_count
    21      FROM  
    22          MY_TABLE
    23      CONNECT BY
    24          PRIOR PARENT_ID = CHILD_ID;
    25 
    26  END MY_TABLE_AI;
    27  /
    Trigger created.Now the scenario plays out like this.
    First, session A starts a transaction with serializable isolation level:
    A> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    Transaction set.Next, session B inserts a row and commits:
    B> INSERT INTO my_table (parent_id, child_id) VALUES (111, 777);
    1 row created.
    B> COMMIT;
    Commit complete.Now, when session A tries to insert a conflicting row:
    A> INSERT INTO my_table (parent_id, child_id) VALUES (777, 111);
    INSERT INTO my_table (parent_id, child_id) VALUES (777, 111)
    ERROR at line 1:
    ORA-08177: can't serialize access for this transaction
    ORA-06512: at "TEST.MY_TABLE_AI", line 5
    ORA-04088: error during execution of trigger 'TEST.MY_TABLE_AI'To show that this still handles other cases:
    1. Conflicting inserts in the same transaction:
    SQL> TRUNCATE TABLE MY_TABLE;
    Table truncated.
    SQL> INSERT INTO my_table (parent_id, child_id) VALUES (111, 777);
    1 row created.
    SQL> INSERT INTO my_table (parent_id, child_id) VALUES (777, 111);
    INSERT INTO my_table (parent_id, child_id) VALUES (777, 111)
    ERROR at line 1:
    ORA-01436: CONNECT BY loop in user data
    ORA-06512: at "TEST.MY_TABLE_AI", line 15
    ORA-04088: error during execution of trigger 'TEST.MY_TABLE_AI'2. Read-committed inserts that conflict with previously committed transactions:
    SQL> TRUNCATE TABLE MY_TABLE;
    Table truncated.
    SQL> INSERT INTO my_table (parent_id, child_id) VALUES (111, 777);
    1 row created.
    SQL> COMMIT;
    Commit complete.
    SQL> INSERT INTO my_table (parent_id, child_id) VALUES (777, 111);
    INSERT INTO my_table (parent_id, child_id) VALUES (777, 111)
    ERROR at line 1:
    ORA-01436: CONNECT BY loop in user data
    ORA-06512: at "TEST.MY_TABLE_AI", line 15
    ORA-04088: error during execution of trigger 'TEST.MY_TABLE_AI'3. Conflicting inserts in concurrent, read-committed transactions:
    a) First, empty out the table and start a read-committed transaction in one session (A):
    A> TRUNCATE TABLE MY_TABLE;
    Table truncated.
    A> SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
    Transaction set.b) Now, start a read-committed transaction in another session (B) and insert a row:
    B> SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
    Transaction set.
    B> INSERT INTO my_table (parent_id, child_id) VALUES (111, 777);
    1 row created.c) Now, try to insert a conflicting row in session A:
    A> INSERT INTO my_table (parent_id, child_id) VALUES (777, 111);This is blocked until session B commits, and when it does:
    B> COMMIT;
    Commit complete.the insert in session A fails:
    INSERT INTO my_table (parent_id, child_id) VALUES (777, 111)
    ERROR at line 1:
    ORA-01436: CONNECT BY loop in user data
    ORA-06512: at "TEST.MY_TABLE_AI", line 15
    ORA-04088: error during execution of trigger 'TEST.MY_TABLE_AI'If updates are permitted on the table, then they could cause loops also, but the trigger could be modified to test for this.

  • Index contention & row lock contention

    Hi,
    Recently our application loaded a handsome amount of data into our production database. The process took around 5 to 6 hours. During this process, we observed that the performance degraded.
    The major wait events are
    1) TX index contention (concurrency) and
    2) ROW LOCK CONTENTION (application).
    The sql which lead to index contention is a simple insert statement into a table x and row lock contention is into a table y.
    Both x and y are major detail tables of our application. X has around 4 foreign keys, one foriegn key is referencing table y. the foreign key column x is indexed.
    our database is on 10gR2 and using ASSM.
    The data block wait event stats during the load process is as follows
    select * from dba_hist_waitstat where snap_id between '21454' and '21462' AND WAIT_COUNT>0 and class='data block';
    SNAP_ID DBID INSTANCE_NUMBER CLASS WAIT_COUNT TIME
    21454 3937665896 1 data block 195089769 33899167
    21455 3937665896 1 data block 195095958 33902183
    21456 3937665896 1 data block 195096398 33902377
    21457 3937665896 1 data block 195097225 33902843
    21458 3937665896 1 data block 195628987 34037147
    21459 3937665896 1 data block 195944006 34055524
    21460 3937665896 1 data block 195944496 34055642
    21461 3937665896 1 data block 196183308 34112433
    21462 3937665896 1 data block 196213292 34127409
    9 rows selected.
    select snap_id,eq_type,req_reason, total_req#, total_wait#,failed_req#, cum_wait_time from dba_hist_enqueue_stat where snap_id between '21454' and '21462' and failed_req#>0 and eq_type='TM'
    SYS@sqdb AS SYSDBA> /
    SNAP_ID EQ REQ_REASON TOTAL_REQ# TOTAL_WAIT# FAILED_REQ# CUM_WAIT_TIME
    21454 TM contention 682928465 14 2735 1750
    21455 TM contention 682939964 14 2735 1750
    21456 TM contention 682950668 14 2735 1750
    21457 TM contention 682967980 14 2735 1750
    21458 TM contention 682983109 14 2735 1750
    21459 TM contention 682998136 14 2735 1750
    21460 TM contention 683006816 14 2735 1750
    21461 TM contention 683018179 14 2735 1750
    21462 TM contention 683432945 14 2735 1750
    9 rows selected.
    I dont see any significant ITL contention on these objects compared to other contention. (from segment statistics)
    SYS@sqdb AS SYSDBA> select b.object_name,a.snap_id, a.physical_writes_total,a.physical_writes_delta,a.physical_reads_total,a.physical_reads_delta, a.itl_waits_total,a.itl_waits_delta from dba_hist_seg_stat a,(select object_id,object_name from dba_objects where owner='ABCD') b where snap_id between '21454' and '21462' and a.obj#= b.object_id and a.itl_waits_delta> 0 order by itl_waits_delta,2,1;
    OBJECT_NAME SNAP_ID PHYSICAL_WRITES_TOTAL PHYSICAL_WRITES_DELTA PHYSICAL_READS_TOTAL PHYSICAL_READS_DELTA ITL_WAITS_TOTAL ITL_WAITS_DELTA
    IX4_Y 21462 37958 169 105668 174 38 1
    IX4_X 21462 102380 1480 147196 5780 56 1
    As per the application design, for each row of Y, there are multiple number of rows in X and it varies. What additional information do you think I should be collecting and any tips to fix the issue?
    Thanks,
    Murthy

    hi
    Are you using in your insert statement something like "SELECT ... FOR UPDATE"
    post the result of this query during the error:
    SELECT * FROM DBA_BLOCKERS;
    SELECT * FROM DBA_WAITERS;

  • Tuning row lock contention wait events

    Hello everyone,
    Working on 10g/windows
    Top 5 events
    EVENT TOTAL_WAITS TIME_WAITED AVG_MS PERCENT
    CPU 9462339 48
    enq: TX - row lock contention 12531 3660728 2921.34 18
    control file parallel write 1300731 3088079 23.74 16
    log file parallel write 1510503 1264080 8.37 6
    log file sync 1072553 968007 9.03 5
    Distribution of row lock wait during the last 4 days in the database server
    END_INTERVAL_TIME TOTAL_WAITS TIME_WAITED_MICRO AVG_WAIT_MS
    2008-04-01 16:00:58 909 2721008230 2993.41
    2008-04-01 15:00:27 50 149941140 2998.82
    2008-03-31 12:00:42 193 575595397 2982.36
    2008-03-29 23:00:13 172 513058700 2982.9
    2008-03-29 22:00:37 164 483940046 2950.85
    2008-03-27 22:00:35 565 1667120838 2950.66
    2008-03-26 18:00:59 348 1042918982 2996.89
    My analysis:
    It's obvious that the row lock contention wait time is huge, and this direct me to find out SQL stmt, causing this.
    all the SQL statement was SELECT ....... FOR UPDATE stmt.
    I was also able to find out locked tables.
    My tuning idea:
    1. I'm thinking to reorganize hot tables as well as their indexes, but by instinct it seems to not give so much value to avoid the huge row lock wait time.
    2. I'm also seeing if I can reduce the number of rows per block, by increasing PCTFREE and diminishing PCTUSED, so the contention will spread over many blocks instead of one heavy block.
    Question
    As SQL stmt related to those locked tables are select ... for update, how could I tune this kind of stmt?
    Does someone have other idea to come up with this row lock contention?
    Tanks for your effort and help

    Taking another look at your suggested function based index, it depends on the data type of the DEV.POS_FOLIO_ID.POS_FOLIO_ID column. If the column is defined as a number, and it is a primary key, there will already be a usable index on that column.
    Yesterday, I wrote this: "Once I understood why or how the sessions were trying to insert duplicate primary key values, I would try to determine why the average number of seconds for the wait event is almost 3 seconds (maybe a timeout)."
    After fixing the formatting of the top 5 wait events (total duration unknown):
    EVENT                        TOTAL_WAITS  TIME_WAITED   AVG_MS PERCENT
    CPU                                         94,623.39             48
    enq: TX - row lock contention     12,531    36,607.28  2921.34    18
    control file parallel write    1,300,731    30,880.79    23.74    16
    log file parallel write        1,510,503    12,640.80     8.37     6
    log file sync                  1,072,553     9,680.07     9.03     512,531 * 3 second time out = 37,593 seconds = 10.44 hours.
    What if the reason for the 3 second average wait time is due to a timeout. I performed a little experiment... I changed a row in a test table and then made a pot of coffee.
    In session 1:
    CREATE TABLE T1 (
      C1 NUMBER(10),
      C2 NUMBER(10),
      PRIMARY KEY (C1));
    INSERT INTO T1
    SELECT
      ROWNUM,
      ROWNUM*10
    FROM
      DUAL
    CONNECT BY
      LEVEL<=1000000;
    COMMIT;I now have a test table with 1,000,000 rows. I start monitoring the changes in the wait events roughly every 60 seconds, and V$SESSION_WAIT and V$LOCK roughly 4 times per second.
    Back in session 1:
    UPDATE
      T1
    SET
      C1=-C1
    WHERE
      C1<=100;I have now modified the first 100 rows that were inserted into the table, time to make the pot of coffee.
    In session 2, I try to insert a row with a primary key value of -10:
    INSERT INTO T1 VALUES (
      -10,
      10);Session 2 hangs.
    If I take the third 60 second snap of the system wide wait events as the zero point, and the 11th snap as the end point. There were 149 waits on ENQ: TX - ROW LOCK CONTENTION, 148 time outs, 446.62 seconds of total time in the wait event, with an average wait time of 2.997450 seconds.
    Rolling down to the session level wait events, SID 208 (my session 2) had 149 waits on ENQ: TX - ROW LOCK CONTENTION, for a total time of 446.61 seconds with an average wait time of 2.997383 seconds. All of the 149 waits and the wait time was in this one session that was locked up for the full duration of this time period because session 1 was making a pot of coffee.
    Rolling down to V$SESSION_WAIT (sampled roughly 4 times per second): At the start of the third time interval, SID 208 has been in the ENQ: TX - ROW LOCK CONTENTION wait event for 39 seconds and is actively waiting trying to execute SQL with a hash value of 1001532423, the wait object is -1, wait file is 0, wait block is 0, wait row is 0, P1 is 1415053316, P2 is 196646, P3 is 4754.
    At the end of the 11th time interval: , SID 208 has been in the ENQ: TX - ROW LOCK CONTENTION wait event for 483 seconds and is actively waiting trying to execute SQL with a hash value of 1001532423, the wait object is -1, wait file is 0, wait block is 0, wait row is 0, P1 is 1415053316, P2 is 196646, P3 is 4754.
    Rolling down to V$LOCK (sampled roughly 4 times per second): I see that SID 214 (session 1) is blocking SID 208 (session 2). SID 214 has a TX lock in mode 6 with ID1 of 196646 and ID2 of 4754. SID 208 is requesting a TX lock in mode 4 with ID1 of 196646 and ID2 of 4754.
    So, it seems that I need a faster coffee pot rather than an additional index on my table. It could be that the above process would have found that the application associated with SID 214 was abandoned or crashed and for some reason the lock was not released for a long period of time, a little less than 10.44 hours in your case.
    Charles Hooper
    IT Manager/Oracle DBA
    K&M Machine-Fabricating, Inc.

  • Row lock contention problem on Inventory Management

    Hi
    My client is product based company and have e-Commerce (online Sale Order) application using Oracle database 10.2.0.5 & Web application deployed on WLS. Client have ~ 90 Warehouse country wide and ~ 200 Products (Items). Each product stock for each warehouse is maintained in Inventory Table (INV_BALANCE) which get updated for each order and their sale's products. We are using NO WAIT function to acquire lock on row to update stock balance. Last few months, client business is growing very fast and during Promotional Events (EXPO), they have sales of ~ 75K orders (~ 250K Items) within 2-3 days which start causing  row lock contention problem on INV_BALANCE table. We are seeing lots of "Row Lock Wait" and "enq: TX - row lock contention" event which cause ORA-00060: Deadlock detected and we need to eventually clear blocking sessions or everything just choked.
    select statistic_name,value from sys.v_$segment_statistics where object_name = 'INV_BALANCE'
    STATISTIC_NAME                                                                                                                        VALUE
    logical reads                                                                                                                                12423072
    buffer busy waits                                                                                                                           3895
    db block changes                                                                                                                         3516768
    physical reads                                                                                                                               957
    physical writes                                                                                                                            12197
    row lock waits                                                                                                                             49909
    space used                                                                                                                                -52921
    Deadlock graph:
                           ---------Blocker(s)--------  ---------Waiter(s)---------
    Resource Name          process session holds waits  process session holds waits
    TX-00880017-00002584       321    1675     X            110    1445           X
    TX-00b60008-00000741       110    1445     X            337    2158           X
    TX-0148000b-0000009e       337    2158     X            378    1525           X
    TX-01d50015-0000006f       378    1525     X            363    1842           X
    TX-02290012-00000070       363    1842     X            267    1798           X
    TX-024a0026-0000006e       267    1798     X            364    2084           X
    TX-020a0004-0000006f       364    2084     X            135    2113           X
    TX-01dc001f-00000070       135    2113     X            129    1586           X
    session 1675: DID 0001-0141-000001CA    session 1445: DID 0001-006E-00000202
    session 1445: DID 0001-006E-00000202    session 2158: DID 0001-0151-0000026B
    session 2158: DID 0001-0151-0000026B    session 1525: DID 0001-017A-00000167
    session 1525: DID 0001-017A-00000167    session 1842: DID 0001-016B-000002B4
    session 1842: DID 0001-016B-000002B4    session 1798: DID 0001-010B-000001F1
    Rows waited on:
    Session 1445: obj - rowid = 0001AE0E - AAAlK8AAHAAD7rMABY
      (dictionary objn - 110094, file - 7, block - 1030860, slot - 88)
    Session 2158: obj - rowid = 0001AE0E - AAAlK8AAHAAD7rMACD
      (dictionary objn - 110094, file - 7, block - 1030860, slot - 131)
    Session 1525: obj - rowid = 0001AE0E - AAAlK8AAHAAD7rOAB2
      (dictionary objn - 110094, file - 7, block - 1030862, slot - 118)
    Information on the OTHER waiting sessions:
    Session 1445:
      sid: 1445 ser: 37 audsid: 38316795 user: 69/<none>
                program: JDBC Thin Client
      application name: JDBC Thin Client, hash value=2546894660
      Current SQL Statement:
      SELECT ROWID, NVL(QTY_PEND,0)+NVL(:B3 ,0) FROM INV_BALANCE WHERE WHS_ID = :B2 AND STOCK_ID = :B1 FOR UPDATE OF QTY_PEND WAIT 10
    Please help me on following
    Q1: How can we reduce the "row lock Contention" on INV_BALANCE, all possible ways & best practices?
    Q2: How can we change the design to not have "row lock Contention" at all?
    Appreciate your help
    Thanks
    Amit Garg
    www.otnblogs.com

    Hi Amit!
    I saw you are using FOR UPDATE  in your query.
    If you  want reduce row locks, then you not must use FOR UPDATE.
    As you know, FOR UPDATE is locking rows.
    Regards
    Mahir M. Quluzade

  • Enq: TX - row lock contention in TOP 5 wait event

    DB version:11.1.0.7.0
    I am having enq: TX - row lock contention in top 5 wait event.
    AWR analyze period - 9-10(pm). During this time only one sql loader is running to insert the data. No other job are running. So there is no chance of other session blocking this session. is there any chance of row lock contention happen by same session.
    SQL> SELECT INDEX_NAME,INDEX_TYPE,UNIQUENESS FROM DBA_INDEXES WHERE TABLE_NAME='DATA_DATA';
    INDEX_NAME INDEX_TYPE UNIQUENES
    CIDX      BITMAP NONUNIQUE
    VIDX           BITMAP NONUNIQUE
    Thanks.

    SQL> SELECT INDEX_NAME,INDEX_TYPE,UNIQUENESS FROM DBA_INDEXES WHERE TABLE_NAME='DATA_DATA';
    INDEX_NAME INDEX_TYPE UNIQUENES
    CIDX BITMAP NONUNIQUE
    VIDX BITMAP NONUNIQUEYou have bitmap indexes here on a table being inserted into. Bitmap Indexes are another source of lock(and deadlock) in OLTP application. You said that the SQLloader was the unique active program but may be you are also triggering another procedure after the load. Procedure in which you might be using also automomous transactions and so on...
    Check first if your table is subject to DML operation in a a multi-user concurrent accesss and in which case you have to get rid of those bitmap indexes
    http://hourim.wordpress.com/2011/03/14/deadlock-%e2%80%93-part-1-bitmap-index/
    Best regards
    Mohamed Houri
    www.hourim.wordpress.com

  • V$system_event, timeouts and row lock contention

    Hello everyone,
    What is the meaning of the total_timeouts column in the v$system_event view if it is related to the event "enq: TX - row lock contention"?
    How can we have a timeout since "query timeout" is a non existent concept on Oracle?
    Maybe I am wrong.
    Regards.
    Carl

    Hello everyone,
    What is the meaning of the total_timeouts column in
    the v$system_event view if it is related to the event
    "enq: TX - row lock contention"?
    How can we have a timeout since "query timeout" is a
    non existent concept on Oracle?
    Maybe I am wrong.
    Regards.
    CarlThe value for timeouts, in this case, indicates the number of times one of the sessions had to wait a full 3 second time slice while waiting for a second session to either commit or roll back, in anticipation of a potential primary key violation. If the second session commits, the first session will receive an error indicating a primary key violation.
    Test setup:
    In session 2:
    CREATE TABLE T1 (C1 VARCHAR2(20) PRIMARY KEY);
    INSERT INTO T1 VALUES ('ORACLE');
    In session 1:
    INSERT INTO T1 VALUES ('ORACLE');
    After executing tha above, allow 60 seconds to elapse after the insert in session 1, and then check the delta values in either V$SYSTEM_EVENT or V$SESSION_EVENT:
    20 waits on ENQ: TX - ROW LOCK CONTENTION, 19 timeouts, 59.99 seconds, with an average wait of 2.9995 seconds.
    Charles Hooper
    IT Manager/Oracle DBA
    K&M Machine-Fabricating, Inc.

  • DB row lock from servlet.

    Hi to all,
    we're developing a J2EE application (with NO Ejb, actually we cannot use them) in which users can select orders from a DB2 database, modify the order, or create a new order. Any order is implemented by a class (Order.java) that exposes methods to execute SELECTs, INSERTs and UPDATEs to the db2 order table; the class mantains a Connection to the database and it's responsible to manage the connection, resultset, prepared statement and so on, and it's possible to specify if we want only read data (executing a select) or read for update the data (so, executing a select ... for update).
    Users can access the data via web: the instances of Order are created by a servlet, which load the data and show them passing the Order instance to a JSP that fills up a form.
    The problem is we want to lock the row corrisponding to the data mapped into Order instance. Initially, we thought we can instantiate an Order, load data with a select for update, saving on a session the instance, and redirect to the Jsp for visualization, without closing the connection; when the user send data via a form, the order is retrieved from the session, updates are performed and session closed. Unluckily, this approach does not work 'cause the Web Container rolls back automatically all unclosed connection. The row lock is lost.
    In very few words, we are trying to keep-alive a Connection after a Servlet method ends. It seems that Servlet specification 2.3 does not allow this, while specification 2.2 does.
    How can we avoid this problem ? We cannot just implement an application-level Lock manager, because the database is a legacy database and data are concurrently accessed by legacy applications.
    Any suggestion would be very appreciated.
    Thanx in advance !
    Claudio.

    Heck (can you say "hec|<" or will the **** filter nuke it?), I had a reply all written up.
    And then I noticed you were cross-posting.
    Please don't.

  • Detect some error during PININST_BBV

    Hi All,
    I sold my HP Envy 17" via eBay, before I shipped it I did a recovery, to give the customer that new laptop experience, it worked OK however windows wouldn't activate.  Microsoft kept saying it's locked by a 3rd party.  The customer returned the laptop, I gave a refund, and now I'm trying to sort the issue out.
    HP sent out recovery disks, now, when I'm trying to perform the recovery, towards the end of the recovery I'm getting the "Detect some error during PININST_BBV" message.
    I've tried resetting BIOS to defaults.
    I've tried turning on legacy boot in BIOS.
    I'm out of options, I don't want to call HP support because it's just too painful a process.
    Has anyone got any ideas?
    Thanks.

     When requesting assistance, please provide the complete model name and product number (p/n) of the HP computer in question. HP/Compaq makes thousands of models of computers. Without this information it may be difficult or impossible to assist you in resolving your issue.
    The above requested information can be found on the bottom of your computer, inside the battery compartment or on the startup BIOS screen. Please see How Do I Find My Model Number or Product Number? for more assistance locating this information. DO NOT include your serial number. Please enter the model/product information into HP's Online Consumer Support page and post it here for our review.
    Tried Recovery - "Detect error during PININST_BBV – Fix: Set BIOS to Factory Defaults
    •Boot computer – immediately click / press F10 to get into the BIOS Manager.
    •Click on F9 to set the BIOS to factory default.
    •Save and Exit
    •Redo the Recovery – remember to leave the wireless light “on” during the Recovery... Didn't work for me
    Set System Date to 8/4/2012 and Redo Factory Reset and System Recovery... Didn't work for me
    Set BIOS to factory default, System Date to 8/4/2012 and performed Minimized Recovery (based on one of these posts)... Successful Minimized Recovery... Set BIOS to factory default, System Date to 8/4/2012 and performed Factory Reset... SUCCESS
    Don't know what, how, or why it worked... but it worked.
    Please try the above suggestions and report back with your findings.
    If you have any further questions, please don't hesitate to ask.
    Please click the White KUDOS "Thumbs Up" to show your appreciation
    Frank
    {------------ Please click the "White Kudos" Thumbs Up to say THANKS for helping.
    Please click the "Accept As Solution" on my post, if my assistance has solved your issue. ------------V
    This is a user supported forum. I am a volunteer and I don't work for HP.
    HP 15t-j100 (on loan from HP)
    HP 13 Split x2 (on loan from HP)
    HP Slate8 Pro (on loan from HP)
    HP a1632x - Windows 7, 4GB RAM, AMD Radeon HD 6450
    HP p6130y - Windows 7, 8GB RAM, AMD Radeon HD 6450
    HP p6320y - Windows 7, 8GB RAM, NVIDIA GT 240
    HP p7-1026 - Windows 7, 6GB RAM, AMD Radeon HD 6450
    HP p6787c - Windows 7, 8GB RAM, NVIDIA GT 240

  • Heavy row lock contention

    Guys,
    I really appreciate your views on this.. Please can some one who have worked on RAC and have an understanding how RAC works, guide me.
    We currently are running a loadtest on one of the new RAC system and we are seeing excessive row lock contention for one table. The table basically has very few rows, say about 6-8 and pretty much every user uses this table to lock rows before fetching some data from other tables. When have a heavy load, we see very high wait on this table and enq TX : Row lock contention.
    What is the best way to avoid this ? Is there anyway, we can modify the design of the application and ensure locking.. The typical query that locks the rows in the table looks like this
    SELECT WL0.CLUB_NAME, WL0.SCHEDULE_ID FROM VF_BINGO_NEXT_CLUB_DRAW WL0 WHERE ( WL0.CLUB_NAME = :1 ) FOR UPDATE As said, they table has only 6-8 rows, so query plan etc doesn't apply. Please can someone who have extensive application knowledge guide me thru ?
    Many thanks in advance.
    G

    > But is there a way to alliviate the concurrency issue, if there is a genuine
    requirement to hold lock on a table. What other options do we have other
    than locking ?
    The purpose of a lock is to ensure data consistency - only 1 process can change that row. So what I find puzzling is why so many app sessions want to change that single row. What data does that row hold that requires continual change? Just what is the purpose of this data if it is consistently and continually changing? What business requirement does it attempt to solve?
    To be honest, this sounds like a major design problem to me.
    Like the surrogate key generator approach I mentioned. You create a PK_SEQUENCE table with columns (tablename, pk_value). Any insert against a table requires a lock on PK_SEQUENCE for the table being inserted into - a read of the PK_VALUE, incrementing it by one and then updating that row with the latest sequence. This way each INSERT gets a "nice sequential number" to use as surrogate key for new rows.
    Even when this is done as an autonomous transaction, it introduces a very expensive resource - why? Because only one session at a time can be serviced by that resource.
    If there are a lot of INSERTs into a table, this approach will quickly become a severe bottleneck as every single insert requires a new surrogate key value and a lock on that PK_SEQUENCE table to obtain that value.
    This problem is solved by allowing/enabling such a resource to serve multiple sessions concurrently. Which is for example what Oracle Sequence objects do within this example I've described.
    The bottom line is that the design you describe introduced a bottleneck by create an expensive and serialised resource that can only serve a single session at a time.
    You need to re-look at the business requirement - and find another way to solve it than to introduce this type of serialised resource and contention.

  • Row lock contention...

    Hello,
    I am working on Oracle 10.2.0.4 on AIX .
    In awr reports we found 'row lock contention' as top wait events. As my knowledge There are two types of locks..
    1. Deadlock - where oracle will automatically rollback the locking query and generate deadlock trace file.
    2. A user session update some rows and not commit/rollback , so other sessions which need to lock same rows , were witing. So dba need to manully kill first
    session which was holding lock.
    We want to know , in which of above scenario in awr report we can see 'row lock contention' wait.
    any idea ..

    Ok, first, I think your definitions are a bit off.
    There is the concept of a lock, or an enqueue. The terms 'lock' and 'enqueue' are synonymous, in Oracle.
    A lock (or enqueue) protects a 'resource'. A TX (transaction) enqueue protects rows which have been locked. Only one transaction is permitted to modify a specific row in a specific table, at a time, for obvious reasons.
    A row-level lock occurs when a session attempts to modify a row that another session has already locked. When that occurs, the session attempting the lock will wait on a TX enqueue.
    These types of locks occur all the time in Oracle, and are not necessarily a bad thing. They are a sign that Oracle is protecting the integrity of your data, and that's a good thing.
    However, when waits on row-level locks begin to dominate the response time of your application, then you have a problem. Generally, this is going to come down to your application design. How can you avoid concurrent sessions colliding on their updates to specific rows? This is something that only you, with your knowledge of your application, can answer.
    Finally, you mentioned the term 'deadlock' before. A deadlock occurs when two or more sessions are simultaneously holding a lock that the other is waiting on, while waiting on a lock the other is holding.
    A simple example would be as follows:
    Consider table_a, with row1 and row2.
    Session 1 takes a lock on row1, no problem.
    Session 2 takes a lock on row2, no problem.
    Now, session 1 attempts to take a lock on row2, but session 2 has lock, so it waits.
    Now, session 2 attempts to take a lock on row1, but session 1 has lock, so it waits.
    This is a deadlock. It would wait forever. But, the Oracle kernel has a deadlock detection mechanism. So, within 3 seconds, Oracle will detect a deadlock, and one of the sessions (usually the one that has been waiting the longest) will catch ORA-00060 deadlock detected, and statement level rollback will occur.
    Hope that clarifies your questions and/or doubts,
    -Mark

  • Row lock contention error to resolve

    hi,
    i m facing sever issue with row lock contention error for the statement and causing concurrency and application usage more making database vulnerable
    UPDATE RULE_DATA SET RULE_DATA = :B3 , UPDATED_BY = :B2 , UPDATED_DATE = SYSDATE WHERE RULE_DATA_SEQ_ID = :B1
    RETURNING PAT_GEN_DETAIL_SEQ_ID INTO :O0
    in this query RULE_DATA_SEQ_ID is primary key and and having index too, how can i over come row lock contention error ,
    if i try like this will it work
    UPDATE RULE_DATA SET RULE_DATA = :B3 , UPDATED_BY = :B2 , UPDATED_DATE = SYSDATE WHERE RULE_DATA_SEQ_ID = :B1
    RETURNING PAT_GEN_DETAIL_SEQ_ID INTO :O0
    log errors into temp_log (sysdate||:O0 ) REJECT LIMIT UNLIMITED;
    commit;
    please help me;

    select sid,  sql_text from v$session s, v$sql q
    where sid in (select sid from v$session
    where state in ('WAITING')
    and wait_class != 'Idle'
    and event='enq: TX - row lock contention'
    and (q.sql_id = s.sql_id or q.sql_id = s.prev_sql_id));
    from the above query if found the sid and sql_text,
    actually three procedures been called at once as a batch from java and given auto commit at once for the batch;
    and in one of the procedure it is called by multiple times with different seq_id's
    what i thought is by logging error can we skip the update statement from locking , this what happening
    where v_tariff_detail_seq_id will be 25,26,28,29,30 like records
    begin
    IF v_tariff_detail_seq_id = 0 THEN
    INSERT INTO pat_tariff_details (
    tariff_detail_seq_id,
    pat_gen_detail_seq_id,
    ward_type_id ,
    room_type_id ,
    days_of_stay ,
    requested_amount,
    approved_amount,
    maximum_allowed_amount,
    notes,
    added_by,
    added_date )
    VALUES (
    pat_tariff_details_seq.NEXTVAL ,
    v_pat_gen_detail_seq_id,
    v_ward_type_id ,
    v_room_type_id ,
    v_days_of_stay ,
    v_requested_amount ,
    v_approved_amount,
    v_maximum_allowed_amount,
    v_notes,
    v_added_by,
    SYSDATE );
    ELSE
    UPDATE pat_tariff_details SET
    room_type_id = v_room_type_id,
    days_of_stay = v_days_of_stay,
    requested_amount = v_requested_amount,
    approved_amount = v_approved_amount,
    maximum_allowed_amount = v_maximum_allowed_amount,
    notes = v_notes,
    updated_by = v_added_by,
    updated_date = SYSDATE
    WHERE tariff_detail_seq_id = v_tariff_detail_seq_id;
    END IF;
    end;
    version is Oracle Database 10g Release 10.2.0.4.0 - 64bit Production
    Edited by: user13134817 on Nov 2, 2012 2:39 AM

Maybe you are looking for

  • Print Utility can't find HP printer on home router

    I have a MacBook (OS X 10.4.11) connected through AirPort to a Linksys WRT54G Router. Internet connection is fine. I have a HP Deskjet 6127 connected trough TCP/IP to the same Router. I tried for several hours to connect to the printer using the Prin

  • Unlimited data plan and discount dispute on new phone

    Problem #1 Before the unlimited data plan was discontinued earlier this month, I added it to my current plan (phone is an LG EnV3) On Monday, 7/18, I became eligible for a new phone upgrade, and wanted to purchase the Driod Incredible 2. While on the

  • Unable to Connect, ORA 12154, Setup routine for Microsoft ODBC errors

    Hi all, I have a Windows 7 Enterprise 64bit SP1 system and I wanted to be able to connect to an oracle database server. However, I am facing a problem with ODBC configuration. I have currently installed both below in ... product\11.2.0\client_1 folde

  • Question about sort after commit

    Hello! I have a view object. I put in "order by clause" some sort(In query tab of this view object). I created jsf page and dropped this view object like table. I also dropped a Commit operation as button. When I change some value in row and press Co

  • Mountain lion mail set up

    is there a way to set up mail in mountain lion like iOS?  I ask this because I have no problem with my mail on my iPad with my works exchange.  I just assumed that the macbook pro 13 retina would act the same way.  I took my new 13in macbook to work