oracle-tom死鎖演示

oracle_db發表於2012-04-20
Oracle 中極少出現死鎖,甚至可以認為幾乎不存在。通常情況下必須人為地提供條件才會產生死鎖

死鎖原因:導致死鎖的頭號原因是外來鍵未加索引,第二號原因是表上的點陣圖索引遭到併發更新

在以下兩種情況下,Oracle 在修改父表後會對子表加一個全表鎖:
如果更新了父表的主鍵(倘若遵循關聯式資料庫的原則,即主鍵應當是不可變的,這種情況就很少見),由於外來鍵上沒有索引,所以子表會被鎖住。如果刪除了父表中的一行,整個子表也會被鎖住(由於外來鍵上沒有索引)。


會話1:

SQL> show user;
USER is ""
SQL> conn /as sysdba
Connected.
SQL> show user;
USER is "SYS"
SQL> create table p ( x int primary key );

Table created.

SQL> create table c ( x references p );

Table created.

SQL> insert into p values ( 1 );
insert into p values ( 2 );
commit;
1 row created.

SQL> 
1 row created.
SQL> insert into c values ( 2 );

1 row created.

SQL> 
會話2:

SQL> conn scott/scott
Connected.
SQL> conn /as sysdba
Connected.
SQL> desc c
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 X                                                  NUMBER(38)

SQL> desc p
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 X                                         NOT NULL NUMBER(38)

SQL> delete from p where x=1;

這個時候會話2就被阻塞了。它在執行刪除之前試圖對錶C 加一個全表鎖。現在,別的會話都不能對C 中的任何行執行DELETE、INSERT 或UPDATE(已經開始的會話可以繼續[3],但是新會話將無法修改C)。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15720542/viewspace-721840/,如需轉載,請註明出處,否則將追究法律責任。

相關文章