oracle-演示tom-insert阻塞

oracle_db發表於2012-04-20
如果應用允許終端使用者生成主鍵/惟一列值,往往就會發生INSERT 阻塞。為避免這種情況,最容易的
做法是使用一個序列來生成主鍵/惟一列值。序列(sequence)設計為一種高度併發的方法,用在多使用者環
境中生成惟一鍵。如果無法使用序列,那你可以使用以下技術,也就是使用手工鎖來避免這個問題,這裡
的手工鎖通過內建的DBMS_LOCK 包來實現。

目的:防止兩個(或更多)會話同時插入相同的值
會話1:

SQL> show user;
USER is "SYS"
SQL> grant execute on dbms_lock to scott;

Grant succeeded.

SQL> set echo on;
SQL> conn scott/scott
Connected.
SQL> create table demo ( x int primary key );

Table created.

SQL> create or replace trigger demo_bifer
  2  before insert on demo
  3  for each row
  4  declare
  5      l_lock_id   number;
  6      resource_busy   exception;
  7      pragma exception_init( resource_busy, -54 );
  8          l_request number;
  9  begin
 10      l_lock_id := 
 11            dbms_utility.get_hash_value( to_char( :new.x ), 0, 102400 );
 12      l_request := ( dbms_lock.request
 13               (  id                => l_lock_id,
 14                  lockmode          => dbms_lock.x_mode,
 15                  timeout           => 0,
 16                  release_on_commit => TRUE ) );
 17          if ( l_request not in (0,4) )
 18      then
 19                  dbms_output.put_line( 'request = ' || l_request );
 20          raise resource_busy;
 21      end if;
 22  end;
 23  /

Trigger created.

SQL> 
SQL> insert into demo(x) values (1);

1 row created.

會話2:插入相同值

SQL> conn scott/scott
Connected.
SQL> insert into demo(x) values (1);
insert into demo(x) values (1)
            *
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified
ORA-06512: at "SCOTT.DEMO_BIFER", line 17
ORA-04088: error during execution of trigger 'SCOTT.DEMO_BIFER'


如果是會話1插入資料後COMMIT;會話2在執行插入相同值操作,是這個結果
SQL> conn scott/scott
Connected.
SQL> insert into scott.demo(x) values(1);
insert into scott.demo(x) values(1)
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.SYS_C005992) violated


SQL> 

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

相關文章