欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2016年01月21日 17:13:43   作者:董斌  
這篇文章主要介紹了Oracle數(shù)據(jù)庫(kù)中對(duì)死鎖的查詢及解決方法,文中用兩個(gè)表創(chuàng)造死鎖的簡(jiǎn)單例子來(lái)說(shuō)明對(duì)死鎖的撤銷方法,需要的朋友可以參考下

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

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

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

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

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

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

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

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

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)阻塞的情況,一直沒(méi)有響應(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è)問(wèn)題可以簡(jiǎn)單用下面的步驟來(lái)說(shuō)明。

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

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

我們來(lái)簡(jiǎn)單說(shuō)明示例一下。

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)一樣的死鎖問(wè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

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

相關(guān)文章

  • oracle中fdisk導(dǎo)致的ASM磁盤數(shù)據(jù)丟失的解決方法

    oracle中fdisk導(dǎo)致的ASM磁盤數(shù)據(jù)丟失的解決方法

    oracle中fdisk 導(dǎo)致的ASM磁盤數(shù)據(jù)丟失 有需要的朋友可參考一下
    2012-10-10
  • Oracle新增和刪除用戶

    Oracle新增和刪除用戶

    這篇文章介紹了Oracle新增和刪除用戶的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • 使用geotools導(dǎo)入shp文件到Oracle數(shù)據(jù)庫(kù)時(shí)表名帶下劃線問(wèn)題的解決方法

    使用geotools導(dǎo)入shp文件到Oracle數(shù)據(jù)庫(kù)時(shí)表名帶下劃線問(wèn)題的解決方法

    這篇文章主要介紹了使用geotools導(dǎo)入shp文件到Oracle數(shù)據(jù)庫(kù)時(shí)表名帶下劃線的問(wèn)題解決 的相關(guān)資料,需要的朋友可以參考下
    2016-08-08
  • oracle to_char函數(shù)將number轉(zhuǎn)成string

    oracle to_char函數(shù)將number轉(zhuǎn)成string

    很多數(shù)據(jù)轉(zhuǎn)換處理操作時(shí),會(huì)遇到將0.007007040000轉(zhuǎn)換成0.70%的需求,我們使用Oracle 的SQL 函數(shù) to_char可以實(shí)現(xiàn)這種轉(zhuǎn)換,需要了解的朋友可以參考下
    2012-11-11
  • ORACLE數(shù)據(jù)表分析

    ORACLE數(shù)據(jù)表分析

    這篇文章介紹了ORACLE進(jìn)行數(shù)據(jù)表分析的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • Oracle常用函數(shù)超詳細(xì)整理

    Oracle常用函數(shù)超詳細(xì)整理

    Oracle是一種常用的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),提供了許多內(nèi)置函數(shù),用于處理和操作數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于Oracle常用函數(shù)超詳細(xì)整理的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • 關(guān)于expdp任務(wù)異常的處理案例詳析

    關(guān)于expdp任務(wù)異常的處理案例詳析

    這篇文章主要給大家介紹了關(guān)于expdp任務(wù)異常處理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • Oracle建立二進(jìn)制文件索引的方法

    Oracle建立二進(jìn)制文件索引的方法

    Oracle建立二進(jìn)制文件索引的方法...
    2007-03-03
  • Oracle計(jì)算時(shí)間差為毫秒的實(shí)現(xiàn)代碼

    Oracle計(jì)算時(shí)間差為毫秒的實(shí)現(xiàn)代碼

    這里我是用分隔字符串單獨(dú)計(jì)算毫秒部分,如果有更好的辦法,請(qǐng)大家分享一下,下面是查詢時(shí)間差為毫秒的模板,需要的朋友可以參考下
    2017-03-03
  • oracle 觸發(fā)器 學(xué)習(xí)筆記

    oracle 觸發(fā)器 學(xué)習(xí)筆記

    觸發(fā)器 是特定事件出現(xiàn)的時(shí)候,自動(dòng)執(zhí)行的代碼塊。類似于存儲(chǔ)過(guò)程,但是用戶不能直接調(diào)用他們。
    2009-05-05

最新評(píng)論