達(dá)夢(mèng)數(shù)據(jù)庫(kù)支持多用戶并發(fā)訪問(wèn)玖像、修改數(shù)據(jù)。在實(shí)際工作中挣输,有可能出現(xiàn)多個(gè)事務(wù)同時(shí)訪問(wèn)纬凤、修改相同數(shù)據(jù)的情況,當(dāng)一個(gè)事務(wù)正在占用某個(gè)資源的鎖撩嚼,此時(shí)另一個(gè)事務(wù)正在請(qǐng)求這個(gè)資源上與第一個(gè)鎖相沖突的鎖類型時(shí)停士,就會(huì)發(fā)生阻塞。此時(shí)完丽,被阻塞的事務(wù)將一直掛起恋技,直到持有鎖的事務(wù)放棄鎖定的資源為止。本文就將給大家介紹如何使用對(duì)應(yīng)的動(dòng)態(tài)性能視圖查看阻塞以及如何解決阻塞逻族。
1.創(chuàng)建測(cè)試表并插入數(shù)據(jù)
建表:
SQL>create table T3(id INT, name VARCHAR(50));
錄入測(cè)試數(shù)據(jù):
begin
for i in 1..100 loop
insert into t3 values(1,'test'||i);
end loop;
commit;
end;
2.在 T3 上面生成 TID 鎖
執(zhí)行 update 操作并且不提交蜻底,具體操作如下:
SQL>update t3 set name='AAA' where id=1;
3.開(kāi)啟新會(huì)話
3.1 在新會(huì)話下執(zhí)行 select 操作
SQL>select * from "SYSDBA"."T3";
可以看到,由于 MVCC 的多版本機(jī)制聘鳞,寫不會(huì)阻塞讀薄辅,所以 select 操作可以正常進(jìn)行。但是前面的事務(wù)沒(méi)有提交搁痛,所以查出來(lái)的結(jié)果還是舊版本的值长搀,也就是 update之前的值。
3.2 在新會(huì)話下執(zhí)行 DML 操作
SQL>delete from t3 where id=1
此時(shí)鸡典,由于 delete 操作需要加上與之前 update 操作相同類型的鎖,所以阻塞發(fā)生枪芒,當(dāng)前事務(wù)被掛起彻况。
4.阻塞的排查
當(dāng)阻塞發(fā)生時(shí)谁尸,我們可以通過(guò) v$lock 視圖查到當(dāng)前數(shù)據(jù)庫(kù)中鎖的狀態(tài)
SQL>select * from V$LOCK
結(jié)果中我們可以看到,事務(wù) 2323 被阻塞了纽甘,阻塞他的事務(wù)為 2319良蛮,同樣我們也可以通過(guò) V$TRXWAIT 視圖查找誰(shuí)阻塞誰(shuí)
SQL>select * from V$TRXWAIT
得出同樣的結(jié)果,ID 為 2323 的事務(wù)正在等待 ID 為 2319 的事務(wù)悍赢,等待時(shí)間是352784毫秒决瞳。
接下來(lái),通過(guò) V$SESSIONS 視圖查找兩個(gè)事務(wù)對(duì)應(yīng)的會(huì)話
select sess_id,sql_text,state,trx_id from V$SESSIONS;
可以得到兩個(gè)事務(wù)對(duì)應(yīng)的會(huì)話 ID 和當(dāng)前執(zhí)行 SQL 語(yǔ)句左权,可以知道是哪些 SQL 語(yǔ)句產(chǎn)生的阻塞皮胡。
5.阻塞的解決方法
5.1 提交或回滾產(chǎn)生阻塞的事務(wù)。
根據(jù)上文赏迟,我們可知產(chǎn)生阻塞的事務(wù)會(huì)話 ID 為140168608750888 屡贺。此時(shí),我們只需要在該會(huì)話下提交或回滾事務(wù)锌杀,鎖自然會(huì)被釋放甩栈,阻塞解決。
5.2 關(guān)閉產(chǎn)生阻塞的會(huì)話
同樣糕再,我們也可以使用系統(tǒng)過(guò)程 SP_CLOSE_SESSION(SESS_ID)來(lái)關(guān)閉對(duì)應(yīng)的會(huì)話量没,具體使用方法如下。
SP_CLOSE_SESSION(140168608750888);
此時(shí)突想,鎖被釋放殴蹄,delete 操作也可以順利進(jìn)行下去。O_O