Oracle FAQ Your Portal to the Oracle Knowledge Grid
HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US
 

Home -> Community -> Mailing Lists -> Oracle-L -> Re: Q about locks

Re: Q about locks

From: Tom Pall <tom_at_cdproc.com>
Date: Tue, 24 Oct 2000 12:13:54 -0500
Message-Id: <10659.120058@fatcity.com>


This metalink article does a very good job of describing parent/child table locks.        

Doc ID: Note:33453.1
Subject: (V7) REFERENTIAL INTEGRITY AND LOCKING Type: FAQ
Status: PUBLISHED
 Content Type: TEXT/PLAIN
Creation Date: 26-JAN-1996
Last Revision Date: 20-JUL-2000
Language: USAENG  

Document ID:          106754.289
Title:                (V7) REFERENTIAL INTEGRITY and LOCKING
Creation Date:        20-October-1994
Last Revision Date:   24-January-1996
Revision Number:      1
Product:              RDBMS
Product Version:      Oracle7
Platform:             GENERIC
Information Type:     SOLUTION
Impact:               MEDIUM
Abstract:             This bulletin explains what referential
                      integrity means and how locking takes place with
                      tables joined by the referential integrity rule.
Keywords:             REFERENTIAL;INTEGRITY;LOCKING;CONSTRAINT;PRIMARY;FOREIGN

-------------------------------------------------------------------------------

                     REFERENTIAL INTEGRITY and LOCKING

This bulletin explains what referential integrity means and how locking takes place with tables joined by the referential integrity rule. In addition, this bulletin explains how inserting/updating/deleting one table can cause another table to get locked.

REFERENTIAL INTEGRITY: is a rule defined on a column (or set of columns) in one table that allows the insert or update of a row only if the value for the column or set of columns (in the child table) matches the value in a column of a related table (parent table).

Example 1:
SQL> create table DEPT (deptno number constraint pk_dept primary key,

     dname varchar2(10))

SQL> create table EMP (deptno number(2) constraint fk_deptno references

     dept(deptno), ename varchar2(20))

In the above example "DEPT" is the parent table having the primary key constraint 'pk_dept' on the 'deptno' column. Similarly "EMP" is the child table having the foreign key constraint 'fk_deptno' on the 'deptno' column. However, this foreign key constraint references the 'deptno' column of the parent table (DEPT) thus enforcing the referential integrity rule. Therefore you cannot add an employee into a department number that doesn't exist in the DEPT table.

Example 2:

SQL> insert into DEPT values (1, 'COSTCENTER');

1 row created.

SQL> insert into EMP values (1, 'SCOTT');

1 row created.

SQL> insert into EMP values (2, 'SCOTT'); insert into EMP values (2, 'SCOTT')

            *
ERROR at line 1:
ORA-02291: integrity constraint (SCOTT.FK_DEPTNO) violated - parent key not found

The query that can be issued to find out the primary and foreign key relation is as follows:

SQL> select a.owner for_owner, a.table_name for_table, a.constraint_name

     for_constr, b.owner pri_owner, b.table_name pri_table, b.constraint_name
     pri_constr from user_constraints a, user_constraints b
     where a.r_constraint_name = b.constraint_name
     and a.constraint_type = 'R'
     and b.constraint_type = 'P';

FOR_OWNER                      FOR_TABLE
------------------------------ ------------------------------
FOR_CONSTR                     PRI_OWNER
------------------------------ ------------------------------
PRI_TABLE                      PRI_CONSTR
------------------------------ ------------------------------
SCOTT                          EMP
FK_DEPTNO                      SCOTT
DEPT                           PK_DEPT


where USER_CONSTRAINTS      : data dictionary view
      CONSTRAINT_TYPE = 'R' : stands for the foreign key constraint
      CONSTRAINT_TYPE = 'P' : stands for the primary key constraint


The data dictionary contains the following views of interest with integrity constraints:

  1. ALL_CONSTRAINTS
  2. ALL_CONS_CONSTRAINTS
  3. CONSTRAINT_COLUMNS
  4. CONSTRAINT_DEFS
  5. USER_CONSTRAINTS
  6. USER_CONS_COLUMNS
  7. USER_CROSS_REFS
  8. DBA_CONSTRAINTS
  9. DBA_CONS_COLUMNS
  10. DBA_CROSS_REFS
LOCKING: Indexes play an important part when dealing with referential integrity and locking. The existence of an index determines the type of lock necessary, if any. Below are examples that will describe this locking phenomenon.

Each example displays output from a Data Dictionary object, V$LOCK. This view gives information about the different types of locks held within the In order to fully understand the output of this view, below is a description of this object.

SQL> desc v$lock;

 Name                            Null?    Type
 ------------------------------- -------- ----
 ADDR                                     RAW(4)
 KADDR                                    RAW(4)
 SID                                      NUMBER
 TYPE                                     VARCHAR2(2)
 ID1                                      NUMBER
 ID2                                      NUMBER
 LMODE                                    NUMBER
 REQUEST                                  NUMBER

where   ADDR = address of lock state object
       KADDR = address of lock
         SID = identifier of process holding the lock
        TYPE = resource type
         ID1 = resource identifier #1
         ID2 = resource identifier #2
       LMODE = lock mode held: 1 (null), 2 (row share), 3 (row exclusive),
                               4 (share), 5 (share row exclusive),
                               6 (exclusive)
     REQUEST = lock mode requested (same values as LMODE)

   TYPE                 LOCK ID1                     LOCK ID2

a) TX(transaction)      Decimal representation of    Decimal rrepresentation
                        rollback segment number      of "wrap" number (number of
                        and slot number              times the rollback slot has
                                                     been reused)

b) TM(table locks)      Object id of table being     Always 0
                        modified

c) UL(user supplied     Please refer to Appendix B-81 of the Oracle7 Server
      lock)             Administrator's Guide.


Examples:

NOTE: In all the examples given below, the object_id for the DEPT and the EMP

      tables are 2989 and 2991 respectively. The ID1 column from the V$LOCK data
      dictionary object corresponds to the OBJECT_ID column from the DBA_OBJECTS
      view.

SQL> select object_name from sys.dba_objects where object_id = 2989;

OBJECT_NAME



DEPT SQL> select object_name from sys.dba_objects where object_id = 2991;

OBJECT_NAME



EMP

NOTE: In 7.1.6 and higher, an insert, update, and delete statement on the child table will not acquire any locks on the parent table, although insert and update statements will wait for a row-lock on the index of the parent table to clear.

SQL> insert into DEPT values (1, 'COSTCENTER');

SQL> commit;

SQL> insert into EMP values (1, 'SCOTT');

SQL> select * from v$lock;

ADDR KADDR SID TY ID1 ID2 LMODE REQUEST
-------- -------- ---------- -- ---------- ---------- ---------- ----------

4002FB14 4002FB24          2 MR          6          0          4          0
4002FB6C 4002FB7C          2 MR          5          0          4          0
4002FB98 4002FBA8          2 MR          4          0          4          0
4002FBC4 4002FBD4          2 MR          3          0          4          0
4002FC1C 4002FC2C          2 MR          1          0          4          0
4002FBF0 4002FC00          2 MR          2          0          4          0
4002FB40 4002FB50          3 RT          1          0          6          0
40078664 40078678         15 TM       2989          0          4          0
4007AD74 4007AE08         15 TX     196667         54          6          0
400786C8 400786DC         15 TM       2991          0          3          0



2) AN INSERT/DELETE/UPDATE ON THE PARENT TABLE CAUSES THE CHILD TABLE TO GET    LOCKED. A share lock (LMODE=4) of the entire child table is required    until the transaction containing the insert/delete/update statement    for the parent table is committed, thus preventing any modifications to the    child table.

NOTE: In 7.1.6 and higher, inserts into the parent table do not lock the child table.

SQL> update dept set deptno = 1;

SQL> select * from v$lock;

ADDR KADDR SID TY ID1 ID2 LMODE REQUEST
-------- -------- ---------- -- ---------- ---------- ---------- ----------

4002FB14 4002FB24          2 MR          6          0          4          0
4002FB6C 4002FB7C          2 MR          5          0          4          0
4002FB98 4002FBA8          2 MR          4          0          4          0
4002FBC4 4002FBD4          2 MR          3          0          4          0
4002FC1C 4002FC2C          2 MR          1          0          4          0
4002FBF0 4002FC00          2 MR          2          0          4          0
4002FB40 4002FB50          3 RT          1          0          6          0
40078664 40078678         15 TM       2991          0          4          0
4007AD74 4007AE08         15 TX     196667         54          6          0
400786C8 400786DC         15 TM       2989          0          3          0


                             ****  WITH INDEXES  ****


  1. AN INSERT/DELETE/UPDATE ON THE CHILD TABLE DOES NOT PLACE LOCKS OF ANY KIND ON THE PARENT TABLE IF THERE IS AN INDEX ON THE FOREIGN KEY OF THE CHILD TABLE. Therefore, any type of DML statement can be issued on the parent table, including inserts, updates, deletes and queries.

SQL> create index ind_emp on emp (deptno, ename);

SQL> insert into DEPT values (1, 'COSTCENTER');

SQL> commit;

SQL> insert into EMP values (1, 'SCOTT');

SQL> select * from v$lock;

ADDR KADDR SID TY ID1 ID2 LMODE REQUEST
-------- -------- ---------- -- ---------- ---------- ---------- ----------

4002FB14 4002FB24          2 MR          6          0          4          0
4002FB6C 4002FB7C          2 MR          5          0          4          0
4002FB98 4002FBA8          2 MR          4          0          4          0
4002FBC4 4002FBD4          2 MR          3          0          4          0
4002FC1C 4002FC2C          2 MR          1          0          4          0
4002FBF0 4002FC00          2 MR          2          0          4          0
40078664 4002FB50          3 RT          1          0          6          0
40078664 40078678         15 TX     196667         54          6          0
4007AD74 4007AE08         15 TM       2991          0          3          0


2) AN INSERT/DELETE/UPDATE ON THE PARENT TABLE WILL ONLY ACQUIRE A ROW LEVEL    LOCK ON THE PARENT TABLE IF THERE IS AN INDEX ON THE FOREIGN KEY OF THE    CHILD TABLE. The child table will have NO locks on it and so any type of    modifications can be made to the child table.

NOTE: In v7.1.6 and higher, inserts, updates and deletes on the parent table do not require any locks on the child table, although updates and deletes will wait for row-level locks to clear on the child table index. If the child table specifies ON DELETE CASCADE, waiting and locking rules are the same as if you deleted from the child table after performing the delete from the parent.

SQL> update DEPT set deptno = 1;

SQL> select * from v$lock;

ADDR KADDR SID TY ID1 ID2 LMODE REQUEST
-------- -------- ---------- -- ---------- ---------- ---------- ----------

4002FB14 4002FB24          2 MR          6          0          4          0
4002FB6C 4002FB7C          2 MR          5          0          4          0
4002FB98 4002FBA8          2 MR          4          0          4          0
4002FBC4 4002FBD4          2 MR          3          0          4          0
4002FC1C 4002FC2C          2 MR          1          0          4          0
4002FBF0 4002FC00          2 MR          2          0          4          0
40078664 4002FB50          3 RT          1          0          6          0
40078664 40078678         15 TX     196667         54          6          0
4007AD74 4007AE08         15 TM       2989          0          3          0

Oracle Worldwide Customer Support
.
Copyright (c) 1995,2000 Oracle Corporation. All Rights Reserved. Legal Notices and Terms of Use.

> Hi DBAs
> 
> Let say I have a child table A(id, b_id, c) and parent table B(id, d, e,
> ...). The field A.b_id has foreign key to B.id and there is a concatened
> index ind1(b_id, c). Does Oracle lock table A in share mode when I update PK
> (id field) in table B ? Or is it possible that Oracle uses an index entries
> to hold the lock?
> 
>  What about if the index has the same fields in reverse order (ind1(c,
> b_id)) ?
> 
> 
> Thanks in advance
> 
> Ed
> 
> Sorry my English
> -- 
> Please see the official ORACLE-L FAQ: http://www.orafaq.com
> -- 
> Author: Shevtsov, Eduard
>   INET: EShevtsov_at_flagship.ru
> 
> Fat City Network Services    -- (858) 538-5051  FAX: (858) 538-5051
> San Diego, California        -- Public Internet access / Mailing Lists
> --------------------------------------------------------------------
Received on Tue Oct 24 2000 - 12:13:54 CDT

Original text of this message

HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US