国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > Oracle > 正文

簡(jiǎn)單說明Oracle數(shù)據(jù)庫中對(duì)死鎖的查詢及解決方法

2020-07-26 14:13:08
字體:
供稿:網(wǎng)友

死鎖的原理
當(dāng)對(duì)于數(shù)據(jù)庫某個(gè)表的某一列做更新或刪除等操作,執(zhí)行完畢后該條語句不提
交,另一條對(duì)于這一列數(shù)據(jù)做更新操作的語句在執(zhí)行的時(shí)候就會(huì)處于等待狀態(tài),
此時(shí)的現(xiàn)象是這條語句一直在執(zhí)行,但一直沒有執(zhí)行成功,也沒有報(bào)錯(cuò)。 
 
死鎖的定位方法
通過檢查數(shù)據(jù)庫表,能夠檢查出是哪一條語句被死鎖,產(chǎn)生死鎖的機(jī)器是哪一臺(tái)。
 
1)用dba用戶執(zhí)行以下語句

select username,lockwait,status,machine,program from v$session where sid in (select session_id from v$locked_object) 

如果有輸出的結(jié)果,則說明有死鎖,且能看到死鎖的機(jī)器是哪一臺(tái)。字段說明:

  • Username:死鎖語句所用的數(shù)據(jù)庫用戶;
  • Lockwait:死鎖的狀態(tài),如果有內(nèi)容表示被死鎖。
  • Status: 狀態(tài),active表示被死鎖
  • Machine: 死鎖語句所在的機(jī)器。
  • Program: 產(chǎn)生死鎖的語句主要來自哪個(gè)應(yīng)用程序。 

 
2)用dba用戶執(zhí)行以下語句,可以查看到被死鎖的語句。

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中處理時(shí),會(huì)自動(dòng)事務(wù)相關(guān)的DML語句撤銷。換句話說,就是Oracle對(duì)于死鎖 問題的處理時(shí)一個(gè)主動(dòng)的過程,會(huì)主動(dòng)切斷其中一個(gè)session的事務(wù)鎖。

先來看一個(gè)簡(jiǎn)單的死鎖案例。

我們創(chuàng)建兩個(gè)表lock_test1,lock_test2,然后使用兩個(gè)session來說明。

session1:

首先在session1中先創(chuàng)建兩個(gè)表,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.

然后嘗試對(duì)lock_test1做delete操作。

n1@TEST11G> delete from lock_test1;20 rows deleted.

session2:

然后切換到session2,對(duì)lock_test2做delete操作。

n1@TEST11G> delete from lock_test2;21 rows deleted.

緊接著,在session1中對(duì)lock_test2做delete操作,這個(gè)時(shí)候出現(xiàn)阻塞的情況,一直沒有響應(yīng)。

session1:

n1@TEST11G> delete from lock_test2;

 

我們?cè)趕ession2中,繼續(xù)對(duì)表Lock_test1做delete操作,這個(gè)時(shí)候會(huì)有短暫的停頓,就會(huì)發(fā)現(xiàn)session1中的事務(wù)被強(qiáng)行撤銷了。

session2:

n1@TEST11G> delete from lock_test1;

session1中的日志如下,可以看到這個(gè)時(shí)候session1中的事務(wù)被強(qiáng)行撤銷了。

n1@TEST11G> delete from lock_test2;delete from lock_test2      *ERROR at line 1:ORA-00060: deadlock detected while waiting for resource

這個(gè)問題可以簡(jiǎn)單用下面的步驟來說明。

  • Session a  table1
  • Session b  table2
  • Session a  table 2
  • Session b  table1

到此為止我們可以看到,死鎖產(chǎn)生的影響是很大的,當(dāng)然,問題還不止于此,在多個(gè)表之間很可能存在死鎖現(xiàn)象,對(duì)于一個(gè)表,也有可能出現(xiàn)死鎖現(xiàn)象。

我們來簡(jiǎn)單說明示例一下。

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';

這個(gè)時(shí)候還是會(huì)出現(xiàn)一樣的死鎖問題,這個(gè)時(shí)候在對(duì)應(yīng)的行上會(huì)有相應(yīng)的鎖。在session2中會(huì)有短暫的停頓,然后把session1中的

給撤銷了,產(chǎn)生的日志如下:

DELETE FROM TEST WHERE TABLE_NAME='LOCK_TEST2' *ERROR at line 1:ORA-00060: deadlock detected while waiting for resource

可見死鎖的問題還是很容易產(chǎn)生的,在編程中處理多并發(fā)的處理時(shí)還是需要多多注意。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 西宁市| 巧家县| 武安市| 山西省| 肇庆市| 左云县| 平潭县| 九龙坡区| 桂阳县| 深泽县| 栾城县| 富源县| 武陟县| 来凤县| 盱眙县| 山东| 县级市| 个旧市| 密山市| 蓝田县| 望奎县| 隆昌县| 辛集市| 嘉兴市| 湄潭县| 精河县| 巍山| 潼关县| 永城市| 延津县| 潮州市| 龙海市| 元氏县| 班戈县| 电白县| 望谟县| 开阳县| 镇安县| 福海县| 道孚县| 湘乡市|