成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

如何進(jìn)行等待事件enqTXrowlockcontention的分析

本篇文章為大家展示了如何進(jìn)行等待事件enq TX row lock contention的分析,內(nèi)容簡明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

創(chuàng)新互聯(lián)建站網(wǎng)站建設(shè)公司,提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè),網(wǎng)頁設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);可快速的進(jìn)行網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,是專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!

通常情況下,Oracle數(shù)據(jù)庫的等待事件enq: TX - row lock contention會(huì)在下列三種情況下會(huì)出現(xiàn)。
第一種情況,是真正的業(yè)務(wù)邏輯上的行鎖沖突,如一條記錄被多個(gè)人同時(shí)修改。這種鎖對(duì)應(yīng)的請(qǐng)求模式是6。
第二種情況,是唯一鍵沖突,如主鍵字段相同的多條記錄同時(shí)插入。這種鎖對(duì)應(yīng)的請(qǐng)求模式是4。這也是應(yīng)用邏輯問題。
第三種情況,是bitmap索引的更新沖突,就是多個(gè)會(huì)話同時(shí)更新bitmap索引的同一個(gè)數(shù)據(jù)塊。此時(shí)會(huì)話請(qǐng)求鎖的對(duì)應(yīng)的請(qǐng)求模式是4。

bitmap索引的物理結(jié)構(gòu)和普通索引一樣,也是 B-tree 結(jié)構(gòu)。但它存儲(chǔ)的數(shù)據(jù)記錄的邏輯結(jié)構(gòu)為"key_value,start_rowid,end_rowid,bitmap"。
其內(nèi)容類似這樣:
"‘8088’,00000000000,10000034441,1001000100001111000"
Bitmap是一個(gè)二進(jìn)制,表示 START_ROWID 到 END_ROWID 的記錄, 1 表示等于 key_value 即‘8088’的 ROWID 記錄, 0 則表示不是這個(gè)記錄。
在了解bitmap索引的結(jié)構(gòu)之后,我們就能理解同時(shí)插入多條記錄到擁有bitmap索引的表時(shí),就會(huì)同時(shí)更新bitmap索引中一個(gè)塊中的記錄,等于某一個(gè)記錄被同時(shí)更新,自然就會(huì)出現(xiàn)行鎖等待。插入并發(fā)量越大,等待越嚴(yán)重。

等待事件enq: TX - row lock contention中的enq是enquence的簡寫。enquence是協(xié)調(diào)訪問數(shù)據(jù)庫資源的內(nèi)部鎖。
所有以“enq:”打頭的等待事件都表示這個(gè)會(huì)話正在等待另一個(gè)會(huì)話持有的內(nèi)部鎖釋放,它的名稱格式是enq:enqueue_type - related_details。這里的enqueue_type是TX,related_details是row lock contention。數(shù)據(jù)庫動(dòng)態(tài)性能視圖v$event_name提供所有以“enq:”開頭的等待事件的列表。
雖然在awrrpt中看到大量enq: TX - row lock contention的等待,但這些是事后看到的信息。根據(jù)AWRRPT,我們無法只能該等待事件的請(qǐng)求模式是什么,是6還是4。
如果數(shù)據(jù)庫一出現(xiàn)enq: TX - row lock contention等待,可以去看v$session和v$session_wait等視圖。

在v$session和v$session_wait中,如果看到的event列是enq: TX - row lock contention的,就表示這個(gè)會(huì)話正處于行鎖等待。該等待事件的請(qǐng)求模式可以從v$session和v$session_wait的p1列中得到。
select sid,
       chr(bitand(p1, -16777216) / 16777215) ||
       chr(bitand(p1, 16711680) / 65535) "Name",
       (bitand(p1, 65535)) "Mode"
  from v$session_wait
 where event like 'enq%';
通過這個(gè)SQL可以將p1轉(zhuǎn)換為易閱讀的文字。

針對(duì)這三種情況,分別進(jìn)行測試:

首先,我準(zhǔn)備一下測試表和數(shù)據(jù)。
--創(chuàng)建測試表和數(shù)據(jù)
SQL> create table t_all_objs as select owner,object_id,object_name from all_objects where 0=1;

Table created.

SQL> alter table T_ALL_OBJS  add constraint pk_t_all_objs primary key (OBJECT_ID);

Table altered.

SQL> insert into t_all_objs(owner,object_id,object_name) values('TEST',2013011701,'test1');

1 row created.

SQL> insert into t_all_objs(owner,object_id,object_name) values('TEST',2013011702,'test2');

1 row created.

SQL> commit;

Commit complete.


第一種情況,不同會(huì)話同時(shí)更新同一條記錄
session1:
SQL> select sid from v$mystat where rownum<2;

       SID
----------
        46

SQL> select * from t_all_objs;                                           

OWNER                           OBJECT_ID OBJECT_NAME
------------------------------ ---------- ------------------------------
TEST                           2013011701 test1
TEST                           2013011702 test2

SQL> update t_all_objs set object_name='test11' where object_id=2013011701;

1 row updated.

未commit

session 2:
SQL> select sid from v$mystat where rownum<2;

       SID
----------
        52

SQL> update t_all_objs set object_name='test101' where object_id=2013011701;

一直等待。。。。。。。。。   


session 3:查詢
SQL> select sid,sql_id,blocking_session,event,p1text,p1,p2text,p2,p3text,p3,wait_class,state from v$session where sid in (46, 52);

  SID SQL_ID        BLOCKING_SESSION EVENT                          P1TEXT             P1 P2TEXT                  P2 P3TEXT             P3 WAIT_CLASS      STATE
----- ------------- ---------------- ------------------------------ ---------- ---------- --------------- ---------- ---------- ---------- --------------- ----------
   46                                SQL*Net message from client    driver id  1650815232 #bytes                   1                     0 Idle            WAITING
   52 c53uad8st2u8t               46 enq: TX - row lock contention  name|mode  1415053318 usn<<16 | slot       65556 sequence        13548 Application     WAITING


--得到sql_id值,查詢出SQL信息
SQL> select s.sql_text,s.EXECUTIONS,s.ELAPSED_TIME/1000000 from v$sql s where sql_id = 'c53uad8st2u8t';

SQL_TEXT                                                               EXECUTIONS S.ELAPSED_TIME/1000000
---------------------------------------------------------------------- ---------- ----------------------
update t_all_objs set object_name='test101' where object_id=2013011701          0             501.178747

--再查詢鎖信息:
SQL> select * from v$lock where sid in (46,52) order by sid, type;

ADDR             KADDR              SID TY        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK
---------------- ---------------- ----- -- ---------- ---------- ---------- ---------- ---------- ----------
000000009398FE58 000000009398FEB0    46 AE        100          0          4          0       3706          0
00007FABEA622FC0 00007FABEA623020    46 TM      87875          0          3          0        597          0
0000000091E37248 0000000091E372C0    46 TX      65556      13548          6          0        597          1
000000009398F820 000000009398F878    52 AE        100          0          4          0        573          0
00007FABEA622FC0 00007FABEA623020    52 TM      87875          0          3          0        543          0
000000009398FBB8 000000009398FC10    52 TX      65556      13548          0          6        543          0

6 rows selected.

查詢得到未46的session最終阻塞了會(huì)話,是根源。

第二種情況,不同會(huì)話中同時(shí)插入主鍵字段相同的記錄
session 1;
SQL> select sid from v$mystat where rownum=1;

       SID
----------
        43

SQL> select * from t_all_objs;

OWNER                           OBJECT_ID OBJECT_NAME
------------------------------ ---------- ------------------------------
TEST                           2013011701 test1
TEST                           2013011702 test2

SQL> insert into t_all_objs(owner,object_id,object_name) values('TEST',2013011703,'test1');

1 row created.
未commit

session 2:
SQL> select sid from v$mystat where rownum=1;

       SID
----------
        55

SQL>  insert into t_all_objs(owner,object_id,object_name) values('TEST',2013011703,'test11');

一直等待。。。。。。。

session 3:查詢  
SQL> select sid,sql_id,blocking_session,event,p1text,p1,p2text,p2,p3text,p3,wait_class,state from v$session where sid in (43, 55);

  SID SQL_ID        BLOCKING_SESSION EVENT                          P1TEXT             P1 P2TEXT                  P2 P3TEXT             P3 WAIT_CLASS      STATE
----- ------------- ---------------- ------------------------------ ---------- ---------- --------------- ---------- ---------- ---------- --------------- ----------
   43                                SQL*Net message from client    driver id  1650815232 #bytes                   1                     0 Idle            WAITING
   55 bsddu35jkskbz               43 enq: TX - row lock contention  name|mode  1415053316 usn<<16 | slot      262149 sequence        13576 Application     WAITING

SQL> select s.sql_text,s.EXECUTIONS,s.ELAPSED_TIME/1000000 from v$sql s where sql_id = 'bsddu35jkskbz';

SQL_TEXT                                                                                             EXECUTIONS S.ELAPSED_TIME/1000000
---------------------------------------------------------------------------------------------------- ---------- ----------------------
 insert into t_all_objs(owner,object_id,object_name) values('TEST',2013011703,'test11')                       0             213.079739

SQL> select * from v$lock where sid in (43, 55) order by sid, type;

ADDR             KADDR              SID TY        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK
---------------- ---------------- ----- -- ---------- ---------- ---------- ---------- ---------- ----------
000000009398F660 000000009398F6B8    43 AE        100          0          4          0        376          0
00007FABEA621F88 00007FABEA621FE8    43 TM      87875          0          3          0        266          0
0000000091E292E0 0000000091E29358    43 TX     262149      13576          6          0        266          1
000000009398F040 000000009398F098    55 AE        100          0          4          0        371          0
00007FABEA621F88 00007FABEA621FE8    55 TM      87875          0          3          0        256          0
0000000091DDB308 0000000091DDB380    55 TX     327688      13773          6          0        256          0
000000009398F900 000000009398F958    55 TX     262149      13576          0          4        256          0

7 rows selected.

最后查詢得是會(huì)話43阻塞了別的會(huì)話,是根源。


第三種情況,不同會(huì)話中同時(shí)bitmap索引列值相同的記錄
session 1:
SQL> select sid from v$mystat where rownum=1;

       SID
----------
        44

SQL> select * from T_ALL_OBJS ;

OWNER                           OBJECT_ID OBJECT_NAME
------------------------------ ---------- ------------------------------
TEST                           2013011701 test1
TEST                           2013011702 test2

SQL>  create bitmap index ind_T_ALL_OBJS on T_ALL_OBJS (owner);

Index created.

SQL> insert into t_all_objs(owner,object_id,object_name) values('TEST',2013011703,'test11');

1 row created.

未commit

session 2:
SQL> select sid from v$mystat where rownum=1;

       SID
----------
        40

SQL> insert into t_all_objs(owner,object_id,object_name) values('TEST',2013011703,'test12');

一直等待。。。。。。。。。。

session 3:查詢
SQL> select sid,sql_id,blocking_session,event,p1text,p1,p2text,p2,p3text,p3,wait_class,state from v$session where sid in (44, 40);

  SID SQL_ID        BLOCKING_SESSION EVENT                          P1TEXT             P1 P2TEXT                  P2 P3TEXT             P3 WAIT_CLASS      STATE
----- ------------- ---------------- ------------------------------ ---------- ---------- --------------- ---------- ---------- ---------- --------------- ----------
   40 8s2tzhjpgx1nc               44 enq: TX - row lock contention  name|mode  1415053316 usn<<16 | slot      655390 sequence        13564 Application     WAITING
   44                                SQL*Net message from client    driver id  1650815232 #bytes                   1                     0 Idle            WAITING

SQL> select s.sql_text,s.EXECUTIONS,s.ELAPSED_TIME/1000000 from v$sql s where sql_id = '8s2tzhjpgx1nc';

SQL_TEXT                                                                                             EXECUTIONS S.ELAPSED_TIME/1000000
---------------------------------------------------------------------------------------------------- ---------- ----------------------
insert into t_all_objs(owner,object_id,object_name) values('TEST',2013011703,'test12')                        0              96.034408

SQL> select * from v$lock where sid in (44, 40) order by sid, type;

ADDR             KADDR              SID TY        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK
---------------- ---------------- ----- -- ---------- ---------- ---------- ---------- ---------- ----------
000000009398E688 000000009398E6E0    40 AE        100          0          4          0        415          0
00007FABEA622FC0 00007FABEA623020    40 TM      87875          0          3          0        110          0
000000009398FBB8 000000009398FC10    40 TX     655390      13564          0          4        110          0
0000000091E54F48 0000000091E54FC0    40 TX     589844      13794          6          0        110          0
000000009398F3C0 000000009398F418    44 AE        100          0          4          0        410          0
00007FABEA622FC0 00007FABEA623020    44 TM      87875          0          3          0        126          0
0000000091E18128 0000000091E181A0    44 TX     655390      13564          6          0        126          1

7 rows selected.

最終查詢得會(huì)話44是阻塞根源。

模擬故障:
session 1:
SQL> select sid from v$mystat where rownum<2;

       SID
----------
        46

SQL> select * from t_all_objs;

OWNER                           OBJECT_ID OBJECT_NAME
------------------------------ ---------- ------------------------------
TEST                           2013011701 test1
TEST                           2013011702 test2

--插入數(shù)據(jù),不提交
SQL> update t_all_objs set object_name='test11' where object_id=2013011701;

1 row updated.

session 2:
SQL> select sid from v$mystat where rownum<2;

       SID
----------
        52

SQL> select * from t_all_objs;

OWNER                           OBJECT_ID OBJECT_NAME
------------------------------ ---------- ------------------------------
TEST                           2013011701 test1
TEST                           2013011702 test2

--對(duì)同一行數(shù)據(jù)進(jìn)行更新,不提交
SQL> update t_all_objs set object_name='test101' where object_id=2013011701;

等待ing.....................

session 3:
--查詢tx鎖會(huì)話sid,row_wait_object#信息
select sid,sql_id,status,blocking_session, ROW_WAIT_OBJ#,ROW_WAIT_FILE#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW# from v$session where event='enq: TX - row lock contention';

  SID SQL_ID        STATUS   BLOCKING_SESSION ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW#
----- ------------- -------- ---------------- ------------- -------------- --------------- -------------
   52 c53uad8st2u8t ACTIVE                 46         87875              1          143649             0

--查詢被鎖的對(duì)象信息:
select object_name from dba_objects where object_id in (87875);

OBJECT_NAME
--------------------------------------------------------------------------------------------------------------------------------
T_ALL_OBJS

select OWNER,OBJECT_NAME,OBJECT_ID,DATA_OBJECT_ID, OBJECT_TYPE from all_objects where object_name='T_ALL_OBJS';

OWNER                          OBJECT_NAME                     OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE
------------------------------ ------------------------------ ---------- -------------- -------------------
SYS                            T_ALL_OBJS                          87875          87875 TABLE

--查詢被鎖的sesson所執(zhí)行的sql
select sql_text from v$sql where sql_id in (select sql_id from v$session where sid=52);

SQL_TEXT
----------------------------------------------------------------------------------------------------
update t_all_objs set object_name='test101' where object_id=2013011701

--最后查詢 V$lock:
select SID,TYPE,ID1,ID2,LMODE,REQUEST,CTIME,BLOCK from V$lock where block=1 or request<>0;

  SID TY        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK
----- -- ---------- ---------- ---------- ---------- ---------- ----------
   46 TX     524304      13916          6          0        296          1
   52 TX     524304      13916          0          6        284          0


或者通過如下SQL查詢會(huì)話之間鎖等待的關(guān)系:
select a.sid hold_sid, b.sid wait_sid, a.type, a.id1, a.id2, a.ctime
  from v$lock a, v$lock b
 where a.id1 = b.id1
   and a.id2 = b.id2
   and a.block = 1
   and b.block = 0;

  HOLD_SID   WAIT_SID TY        ID1        ID2      CTIME
---------- ---------- -- ---------- ---------- ----------
        46         52 TX     524304      13916       2717

或者如下
 select decode(request,0,'holder: ','waiter: ') ||
 sid session_id, id1, id2, lmode, request, type
 from v$lock
 where (id1, id2, type) in (select id1, id2, type from v$lock where request > 0)
 order by id1, request;

SESSION_ID                                              ID1        ID2      LMODE    REQUEST TY
------------------------------------------------ ---------- ---------- ---------- ---------- --
holder: 46                                           524304      13916          6          0 TX
waiter: 52                                           524304      13916          0          6 TX

 
最后可知sid為46的會(huì)話是阻塞根源。解決聯(lián)系應(yīng)用是不是會(huì)話為提交,或者kill掉

上述內(nèi)容就是如何進(jìn)行等待事件enq TX row lock contention的分析,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)站名稱:如何進(jìn)行等待事件enqTXrowlockcontention的分析
URL鏈接:http://jinyejixie.com/article4/pocsoe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、動(dòng)態(tài)網(wǎng)站、商城網(wǎng)站、云服務(wù)器、品牌網(wǎng)站設(shè)計(jì)、營銷型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)
秦皇岛市| 封开县| 石泉县| 阳谷县| 观塘区| 洛宁县| 旌德县| 聂拉木县| 湟中县| 金坛市| 讷河市| 永年县| 金坛市| 芷江| 盐源县| 石城县| 高淳县| 罗江县| 华亭县| 越西县| 霍州市| 腾冲县| 宝应县| 海南省| 镇安县| 汉源县| 西充县| 瓮安县| 西宁市| 沙坪坝区| 大方县| 泾阳县| 盐亭县| 宜黄县| 延吉市| 岗巴县| 化州市| 台山市| 南涧| 成安县| 祁阳县|