oracle-演示tom-insert阻塞
如果應用允許終端使用者生成主鍵/惟一列值,往往就會發生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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle-多表查詢Oracle
- Oracle-行列轉換Oracle
- ORACLE- Secure Backup DocumentationOracle
- 同步非同步,阻塞非阻塞非同步
- 非同步、同步、阻塞、非阻塞非同步
- 同步、非同步、阻塞、非阻塞非同步
- 阻塞IO與非阻塞IO
- Oracle-欄位的新增Oracle
- ORACLE-體系結構Oracle
- oracle-審計導數Oracle
- ORACLE-資料恢復Oracle資料恢復
- Oracle-點陣圖索引Oracle索引
- Oracle-常用監控SQLOracleSQL
- 同步非同步 與 阻塞非阻塞非同步
- 理解阻塞、非阻塞、同步、非同步非同步
- 同步、非同步,阻塞、非阻塞理解非同步
- 同步、非同步、阻塞與非阻塞非同步
- 同步、非同步、阻塞和非阻塞非同步
- 驅動Driver-阻塞&非阻塞
- [轉]阻塞/非阻塞與同步/非同步非同步
- Java NIO 阻塞式與非阻塞式Java
- 同步與非同步 阻塞與非阻塞非同步
- Oracle-解鎖scott賬戶Oracle
- oracle-手工建庫指令碼Oracle指令碼
- oracle-記憶體表(轉)Oracle記憶體
- Oracle 阻塞Oracle
- 同步、非同步、阻塞、非阻塞的區別非同步
- 查詢阻塞與被阻塞SQL語句SQL
- 阻塞佇列一——java中的阻塞佇列佇列Java
- [譯] 非同步程式設計:阻塞與非阻塞非同步程式設計
- 【linux】驅動-13-阻塞與非阻塞Linux
- 徹底搞懂同步非同步與阻塞非阻塞非同步
- IO - 同步 非同步 阻塞 非阻塞的區別非同步
- 同步、非同步、阻塞、非阻塞的簡單理解非同步
- 同步與非同步、阻塞與非阻塞的理解非同步
- FastAPI之阻塞式io和非阻塞式ioASTAPI
- [作業系統]阻塞io 非阻塞io Epoll作業系統
- Oracle-繫結執行計劃Oracle