enq: TX - row lock contention事件:表的行鎖等待事件围辙。
查詢資料獲鹊簟:row lock contention事件產(chǎn)生的原因有以下五種:
1恭陡、第一種情況:當(dāng)兩個(gè)會(huì)話對(duì)同一行進(jìn)行更新時(shí)对雪,ORACLE為了保證數(shù)據(jù)庫(kù)的一致性乔夯,加了一個(gè)TX鎖,這時(shí)另一個(gè)或多個(gè)會(huì)話必須等待第一個(gè)會(huì)話commit或rollback征椒,否則會(huì)一等待下去踊淳,這是最為常見(jiàn)的一種模式!
2陕靠、第二種情況:兩個(gè)或多個(gè)會(huì)話向具有唯一主健索引的表中插入或更新相同的數(shù)據(jù)行迂尝,既然是唯一主健索引,那么先獲得插入的session以TX排它鎖模式進(jìn)行添加剪芥,此時(shí)其它session只能等待垄开,也是常見(jiàn)的一種情況
3、第三種情況:兩個(gè)或多個(gè)會(huì)話插入或更新具有位圖索引的列税肪,跟據(jù)位圖索引的特性溉躲,一個(gè)索引鍵值對(duì)應(yīng)多個(gè)數(shù)據(jù)行的rowid值榜田,此種情況下也是以TX模式訪問(wèn),一般在OLTP系統(tǒng)中很少有位圖索引锻梳,但不排除個(gè)別系統(tǒng)箭券,本例中不存在位圖索引。
4疑枯、第四種情況:調(diào)用dbms_repair包時(shí)也會(huì)產(chǎn)生TX--在網(wǎng)上看到的辩块,具體怎么個(gè)原理,后面有空再研究該包
5荆永、第五種情況:由ORACLE BUG引起的
? ? Bug 3159414 ? ?documents another case where we might see?a TX request in mode 4 when constraints?are involved.
? ? Bug 5849679 ? ?documents an undetected deadlock case with RAC.
產(chǎn)生該等待事件的原因基本上就是上面五種情況废亭,前三種優(yōu)為常見(jiàn)。
一具钥、創(chuàng)建一個(gè)enq: TX - row lock contention 鎖(使用行操作的方式)
? ? 創(chuàng)建臨時(shí)表bd_ma
? ? 然后打開(kāi)一個(gè)sql窗口(創(chuàng)建一個(gè)session)執(zhí)行delete命令豆村,但不提交
再打開(kāi)一個(gè)sql窗口(再創(chuàng)建一個(gè)session)也執(zhí)行delete命令
此時(shí)就可以發(fā)現(xiàn)該命令一直等待上一個(gè)delete結(jié)束,此時(shí)即創(chuàng)造了一個(gè)enq: TX - row lock contention事件骂删。
二掌动、被用戶創(chuàng)建后,如何在當(dāng)時(shí)找到該事件宁玫,并處理
1粗恢、視圖v$session中事件等于enq: TX - row lock contention的
sid = 37的session在等待
2、同樣通過(guò)v$session找到處理的對(duì)象
obj_id = 91674撬统,該對(duì)象可能是表也可能是索引或者其他的
3、看下該對(duì)象是什么查找dba_object表敦迄,中id = 91674的
發(fā)現(xiàn)該對(duì)象是表恋追,名稱(chēng)是bd_ma.
到此知道發(fā)生行鎖等待事件的對(duì)象是bd_ma這個(gè)表造成的。
4罚屋、繼續(xù)找到是哪個(gè)用戶在執(zhí)行什么操作造成:
同樣通過(guò)v$session去找苦囱,發(fā)現(xiàn)osuser是derek,即客戶端是derek這臺(tái)客戶端造成的脾猛,信息部可以追蹤到該客戶端的使用用戶撕彤。
5、找到是哪個(gè)語(yǔ)句造成的猛拴,通過(guò)v$session和v$sql找到sqltext羹铅。
到此就可發(fā)現(xiàn)是因?yàn)閐elete命令一直沒(méi)有提交造成。
三愉昆、若是歷史AWR中如何找到線索职员?
1、通過(guò)dba_hist_active_sess_history找到發(fā)生過(guò)enq: TX - row lock contention事件的session_id.sql_id
發(fā)現(xiàn)歷史有兩個(gè)跛溉,分別是session = 40和session = 15焊切。
2扮授、找到對(duì)應(yīng)的session具體信息,是哪個(gè)machine
3专肪、找到當(dāng)時(shí)發(fā)生時(shí)候的語(yǔ)句刹勃。
附當(dāng)時(shí)發(fā)生時(shí)候跟蹤的所有sql
--找到發(fā)生enq: TX - row lock contention的等待事件
select event,sid,p1,p2,p3 from v$session_wait where event = 'enq: TX - row lock contention';
--1 enq: TX - row lock contention 37 1415053318 589833 1934
--看這些session在等什么對(duì)象
select event, ROW_WAIT_OBJ#,ROW_WAIT_FILE#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW# from v$session
where event='enq: TX - row lock contention';
--1 enq: TX - row lock contention 91674 5 10441 0
--說(shuō)明在等91674這個(gè)對(duì)象
--看91674這個(gè)對(duì)象是什么
select object_name,object_id,owner,object_type from dba_objects where object_id='91674';
--1 BD_MA 91674 NC633 TABLE? ? ? ? ? ? ? ? 原來(lái)是table
--另,查看是什么語(yǔ)句造成的等待事件嚎尤,填入等待事件的sid
select sid,sql_text from v$session a,v$sql b where sid in('37')
and (b.sql_id=a.sql_id );
--看下是哪里的客戶端造成的
select sid,serial#,username,status,osuser,machine,port,terminal,program,sql_id,sql_exec_start,prev_sql_id, type from v$session where sid = '37'
--1 37 162 NC633 ACTIVE derek WORKGROUP\DEREKPC 60452 DEREKPC plsqldev.exe 8tzau2c2gbdtr 2015/8/12 13:45:58 9m7787camwh4m USER
select * from v$lock where type = 'TX';
select s.sid, q.sql_id,q.SQL_FULLTEXT
from v$session s, v$sql q
where sid in
(select sid
from v$session
where state in ('WAITING')
and wait_class != 'Idle'
and event = 'enq: TX - row lock contention'
and (q.sql_id = s.sql_id or q.sql_id = s.prev_sql_id));
附歷史發(fā)生時(shí)候查找的sql
--查找歷史發(fā)生過(guò)enq: TX - row lock contention事件的記錄
select session_id,session_serial#,sql_id from dba_hist_active_sess_history
where event = 'enq: TX - row lock contention' order by sample_time;
--找到session_id 和sql_id是1 40 298 8tzau2c2gbdtr
-- 77 15 680 8tzau2c2gbdtr
--查看對(duì)應(yīng)session_id的信息
select distinct session_id,sql_id,sql_opname,program,module,action,machine from v$active_session_history where session_id in ('40','15')
and event = 'enq: TX - row lock contention'
and is_awr_sample = 'Y'
--查看對(duì)應(yīng)session執(zhí)行的語(yǔ)句
select -- s.SAMPLE_TIME,
distinct s.SESSION_ID,
sq.SQL_TEXT,
--sq.SQL_FULLTEXT,
sq.SQL_ID
from v$sql sq, v$active_session_history s
where s.SQL_ID = sq.SQL_ID
and s.SESSION_ID in ('15','40')
and sq.SQL_ID = '8tzau2c2gbdtr'
附參考:
enq: TX - row lock contention等待事件http://blog.csdn.net/songyang_oracle/article/details/6433753
解決一則enq: TX - row lock contention的性能故障http://www.oracleonlinux.cn/2012/11/resolve-row-lock-contention/
oracle的TM鎖荔仁、TX鎖
http://blog.sina.com.cn/s/blog_95b5eb8c0101i22x.html?
結(jié)語(yǔ):簡(jiǎn)書(shū)不適合寫(xiě)這種文章……以后不寫(xiě)了。字體都太大了~~~看起來(lái)好累