達夢數據庫表被鎖的處理辦法

處理表被鎖的方法
1.創建測試表並插入數據
2.在 T1 上面生成 TID 鎖
3.開啓新會話
3.1 在新會話下執行 select 操作
3.2 在新會話下執行 DML 操作
4.阻塞的排查
5.阻塞的解決方法
5.1 提交或回滾產生阻塞的事務。
5.2 關閉產生阻塞的會話
達夢數據庫支持多用戶併發訪問、修改數據。在實際工作中,有可能出現多個事務同時訪問、修改相同數據的情況,當一個事務正在佔用某個資源的鎖,此時另一個事務正在請求這個資源上與第一個鎖相沖突的鎖類型時,就會發生阻塞。此時,被阻塞的事務將一直掛起,直到持有鎖的事務放棄鎖定的資源爲止。本文就將給大家介紹如何使用對應的動態性能視圖查看阻塞以及如何解決阻塞。

1.創建測試表並插入數據
建表:

create table T1(ID integer,name varchar(50));

insert into t1(id,name) values(1,'test');

2.在 T1 上面生成 TID 鎖
執行 update 操作並且不提交,具體操作如下:

update t1 set name = 'aaa' where id = 1;

3.開啓新會話
3.1 在新會話下執行 select 操作

select * from t1;

可以看到,由於 MVCC 的多版本機制,寫不會阻塞讀,所以 select 操作可以正常進行。但是前面的事務沒有提交,所以查出來的結果還是舊版本的值,也就是 update之前的值。

3.2 在新會話下執行 DML 操作

delete from t1 where id = 1;

此時,由於 delete 操作需要加上與之前 update 操作相同類型的鎖,所以阻塞發生,當前事務被掛起。

4.阻塞的排查
當阻塞發生時,我們可以通過 v$lock 視圖查到當前數據庫中鎖的狀態

select * from v$lock;

結果中我們可以看到,事務 2399 被阻塞了,阻塞他的事務爲 2393,同樣我們也可以通過 V$TRXWAIT 視圖查找誰阻塞誰,

select * from v$trxwait;

得出同樣的結果,ID 爲 2399 的事務正在等待 ID 爲 2393 的事務,等待時間是1071599 毫秒。
接下來,通過 V$SESSIONS 視圖查找兩個事務對應的會話

select sess_id,sql_text,state,trx_id from v$sessions;

可以得到兩個事務對應的會話 ID 和當前執行 SQL 語句,可以知道是哪些 SQL 語句產生的阻塞。

5.阻塞的解決方法
根據需求,可以有兩種解決方案。

5.1 提交或回滾產生阻塞的事務。
根據上文,我們可知產生阻塞的事務會話 ID 爲 2410147992。此時,我們只需要在該會話下提交或回滾事務,鎖自然會被釋放,阻塞解決。

5.2 關閉產生阻塞的會話
同樣,我們也可以使用系統過程 SP_CLOSE_SESSION(SESS_ID)來關閉對應的會話,具體使用方法如下。

sp_close_session(session_id);

此時,鎖被釋放,delete 操作也可以順利進行下去。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章