sequence可能引發的各種lock/enqueue
Oracle將資料字典存於sga中的dictionary cache,而想要修改其中的內容,需要獲取row cache lock;
對於sequence,呼叫的時候可能會遇到以下三種鎖:
Row cache lock(nocache): 當sequence設定為nocache,呼叫sequence.nextval;
enq:SQ-contention(cache+noorder): 在記憶體上cache範圍內,呼叫sequence.nextval;期間以SSX模式獲得SQ鎖;
SV鎖(cache+order): RAC環境,sequence賦予了cache+order屬性,呼叫sequence.nextval;
同時建立大量會話時,可能也會遇到SQ鎖,因為v$session.audsid(auditing sessionid)的值是利用sequence建立的,oracle建立新會話時,利用sys.AUDSESS$的nextval建立AUDSID的值;
RAC:
1、 sequence(cache + noorder):則各節點會把不同範圍的值sequence值cache到記憶體中;
比如擁有兩個節點的RAC環境下,建立CACHE值為100的 sequence時,1節點會使用1-100,2節點會使用101-200
2、sequence(cache + order):呼叫sequence.nextval時,以ssx模式獲取SV鎖;若獲取過程中發生爭用,則等待DFS lock handle事件;
實驗:oracle版本11.2.0.2
先建立nocache的sequence
create sequence SEQ_TEST_ID
minvalue 1
maxvalue 999999999999999999999999999
start with 1
increment by 1
nocache;
--session 1
declare
v_cnt number := 0;
v_c number(20) := 0;
begin
for i in 1..1000000000 loop
select seq_test_id.nextval into v_c from dual;
v_cnt := v_cnt + 1;
end loop;
end;
--session 2
declare
v_cnt number := 0;
v_c number(20) := 0;
begin
for i in 1..1000000000 loop
select seq_test_id.nextval into v_c from dual;
v_cnt := v_cnt + 1;
end loop;
end;
--session 3
SQL> select sid,seq#,event from v$session_wait where event like '%row%';
SID SEQ# EVENT
---------- ---------- ----------------------------------------------------------------
637 52263 row cache lock
3434 52204 row cache lock
SQL> select sql_text,s.SID,s.SERIAL#,sw.EVENT from v$sql sql, v$session s, v$session_wait sw where sql.SQL_ID = s.SQL_ID
2 and s.SID = sw.SID and sw.event like '%row%';
SQL_TEXT SID SERIAL# EVENT
---------------------------------------- ---------- ---------- ----------------------------------------------------------------
SELECT SEQ_TEST_ID.NEXTVAL FROM DUAL 637 49339 row cache lock
SELECT SEQ_TEST_ID.NEXTVAL FROM DUAL 3434 10079 row cache lock
建立cache為20
create sequence SEQ_TEST_ID
minvalue 1
maxvalue 999999999999999999999999999
start with 1
increment by 1;
-session 1
declare
v_cnt number := 0;
v_c number(20) := 0;
begin
for i in 1..1000000000 loop
select seq_test_id.nextval into v_c from dual;
v_cnt := v_cnt + 1;
end loop;
end;
-session 2
declare
v_cnt number := 0;
v_c number(20) := 0;
begin
for i in 1..1000000000 loop
select seq_test_id.nextval into v_c from dual;
v_cnt := v_cnt + 1;
end loop;
end;
--session 3
SQL> select sid,seq#,event from v$session_wait where event like '%contention%';
SID SEQ# EVENT
---------- ---------- ----------------------------------------------------------------
637 33497 enq: SQ - contention
3434 43336 enq: SQ – contention
SQL> select sql_text,s.SID,s.SERIAL#,sw.EVENT from v$sql sql, v$session s, v$session_wait sw where sql.SQL_ID = s.SQL_ID
2 and s.SID = sw.SID and sw.event like '%contention%';
SQL_TEXT SID SERIAL# EVENT
---------------------------------------- ---------- ---------- ----------------------------------------------------------------
SELECT SEQ_TEST_ID.NEXTVAL FROM DUAL 637 49339 enq: SQ - contention
SELECT SEQ_TEST_ID.NEXTVAL FROM DUAL 3434 10079 enq: SQ - contention
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15480802/viewspace-697433/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle enqueue lockOracleENQ
- enable table lock 的enqueue等待ENQ
- C#中各種Lock的速度比較C#
- enqueue種類ENQ
- enqueue的種類(zt)ENQ
- WAITED TOO LONG FOR A ROW CACHE ENQUEUE LOCK!的分析AIENQ
- WAITED TOO LONG FOR A ROW CACHE ENQUEUE LOCK!AIENQ
- ORACLE 中的Enqueue 種類OracleENQ
- 面試可能會遇到的各種問題講解面試
- ORACLE sequence各引數及建立修改刪除使用詳解示例Oracle
- 故障排除:"WAITED TOO LONG FOR A ROW CACHE ENQUEUE LOCK! "AIENQ
- mutex,latch,lock,enqueue hash chains latch基礎概念MutexENQAI
- 一次WAITED TOO LONG FOR A ROW CACHE ENQUEUE LOCKAIENQ
- Metlink:Troubleshooting:WAITED TOO LONG FOR A ROW CACHE ENQUEUE LOCK!AIENQ
- 風控GPS的各種演算法引數演算法
- MVC接收以post形式傳輸的各種引數MVC
- 軟體開發各個階段用到的各種圖
- WAITED TOO LONG FOR A ROW CACHE ENQUEUE LOCK! 與 dc_tablespcesAIENQ
- WAITED TOO LONG FOR A ROW CACHE ENQUEUE LOCK-[ID 278316.1]AIENQ
- [Spring MVC] - SpringMVC的各種引數繫結方式SpringMVC
- [HotSpot VM] JVM調優的"標準引數"的各種陷阱HotSpotJVM
- Oracle Sequence Cache 引數說明Oracle
- JS中缺少分號可能引發的問題JS
- 自動生成介面各種逆向組合引數
- IOS開發中遇到過的各種坑洞iOS
- 值得收藏!Web開發的各種效能工具Web
- 各種索引型別發生的條件索引型別
- 開發作業系統的各種方法作業系統
- 程式猿的年終總結,各種版本各種殘
- 開發可能會用到的三種快取key快取
- 可能引發程式設計革命的4門語言程式設計
- innodb next-key lock引發的死鎖現象分析
- php全面獲取url位址列及各種引數PHP
- 各種開發工具索引/目錄索引
- 翻譯metalink關於WAITED TOO LONG FOR A ROW CACHE ENQUEUE LOCK文章AIENQ
- 【原創】說說你是如何理解Oracle資料庫中latch和enqueue lock的?Oracle資料庫ENQ
- 跨平臺開發,各種巨集的定義
- JAVA的各種OJava