簡單說明Oracle資料庫中對死鎖的查詢及解決方法

2022-10-06 01:30:12 字數 2628 閱讀 1021

死鎖的原理

當對於資料庫某個表的某一列做更新或刪除等操作,執行完畢後該條語句不提

交,另一條對於這一列資料做更新操作的語句在執行的時候就會處於等待狀態,

此時的現象是這條語句一直在執行,但一直沒有執行成功,也沒有報錯。 

死鎖的定位方法

通過檢查資料庫表,能夠檢查出是哪一條語句被死鎖,產生死鎖的機器是哪一台。

1)用dba使用者執行以下語句

select username,lockwait,status,machine,program from v$session where sid in

(select session_id from v$locked_object)

如果有輸出的結果,則說明有死鎖,且能看到死鎖的機器是哪一台。字段說明:

2)用dba使用者執行以下語句,可以檢視到被死鎖的語句。

select sql_text from v$sql where hash_value in

(select sql_hash_value from v$session where sid in

(select session_id from v$locked_object))

死鎖的解決例子

死鎖在oracle中處理時,會自動事務相關的dml語句撤銷。換句話說,就是oracle對於死鎖 問題的處理時乙個主動的過程,會主動切斷其中乙個session的事務鎖。

先來看乙個簡單的死鎖案例。

我們建立兩個表lock_test1,lock_test2,然後使用兩個session來說明。

session1:

首先在session1中先建立兩個表,lock_test1,lock_test2

n1@test11g> create table lock_test1 as select *from cat;

table created.

n1@test11g> create table lock_test2 as select *from cat; 程式設計客棧

table created.

然後嘗試對lock_test1做delete操作。

n1@test11g> delete from lock_test1;

20 rows deleted.

session2:

然後切換到session2,對lock_test2做delete操作。

n1@test11g> delete from lock_test2;

21 rows deleted.

緊接著,在session1中對lock_test2做delete操作,這個時候出現阻塞的情況,一直沒有響應。

session1:

n1@test11g> delete from lock_test2;

我們在session2中,繼續對錶lock_test1做delete操作,這個時候會有短暫的停頓,就會發現session1中的事務被強行撤銷了。

session2:

n1@test11g> delete from lock_test1;

session1中的日誌如下,可以看到這個時候session1中的事務被強行撤銷了。

n1@test11g> delete from 程式設計客棧lock_test2;

delete from lock_test2

*error at line 1:

ora-00060: deadlock detected while w for resource

這個問題可以簡單用下面的步驟來說明。

到此為止我們可以看到,死鎖產生的影響是很大的,當然,問題還不止於此,在多個表之間很可能存在死鎖現象,對於乙個表,也有可能出現死鎖現象。

我們來簡單說明示例一下。

session1:

create table test as select *from user_tables;

n1@test11g> delete from test where table_name='lock_test1';

1 row deleted.

session2:

n1@test11g> delete from test where table_name='lock_test2';

1 row deleted.

session1:

n1@test11g> delete from test where table_name='lock_test2';

session2:

n1@test11g> delete from test where table_name='lock_test1';

這個時候還是會出現一樣的死鎖問題,這個時候在對應的行上會有相應的鎖。在session2中會有短暫的停頓,然後把session1中的

給撤銷了,產生的日誌如下:

delete from test where table_name='lock_test2'

*error at line 1:

ora-00060: deadlock detected while waiting for resource

可見死鎖的問題還是很容易產生的,在程式設計中處理多併發的處理時還是需要多多注意。

本文標題: 簡單說明oracle資料庫中對死鎖的查詢及解決方法

本文位址:

COGNOS8內容儲存資料庫表簡單說明

在cognos內容儲存表使用cognos 8的作為repository的資料庫。因此,乙個常規資料庫備份是很重要的!所有你的資料夾,報告和安全儲存在這些表。表結構時建立的cognos cognfiguration是第一次啟動。表名descrition cmsysprops該錶的內容儲存版本。cmob...

JS中push 的作用簡單說明

1.push 方法可以向陣列的末尾新增乙個或多個元素,並返回新的長度。2.語法 arrayobject.push newelement1,newelement2,3.返回值 把指定的值新增到陣列後的新長度。4.說明 push 方法可以把他的引數順序新增到arrayobject的尾部。它可以直接修改 ...

oracle資料庫簡單操作

cmd sqlplus 使用者名稱 密碼 orcl 全域性資料庫名 如果是sys使用者登入的話,要輸入 使用者名稱 密碼 orcl as sysdba 建立表空間 create tablespace 表空間名 datafile 資料庫檔案存放的路徑 size 表空間大小 autoextend on ...