十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊
量身定制 + 運營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
1.查哪個過程被鎖
創(chuàng)新互聯(lián)是一家專注于網(wǎng)站設(shè)計、網(wǎng)站建設(shè)與策劃設(shè)計,南譙網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:南譙等地區(qū)。南譙做網(wǎng)站價格咨詢:18980820575
查V$DB_OBJECT_CACHE視圖:SELECT*FROMV$DB_OBJECT_CACHEWHEREOWNER='過程的所屬用戶'ANDLOCKS!='0';
2. 查是哪一個SID,通過SID可知道是哪個SESSION.
查V$ACCESS視圖:SELECT*FROMV$ACCESSWHEREOWNER='過程的所屬用戶'ANDNAME='剛才查到的過程名';
3. 查出SID和SERIAL#
查V$SESSION視圖:SELECTSID,SERIAL#,PADDRFROMV$SESSIONWHERESID='剛才查到的SID'查V$PROCESS視圖:SELECTSPIDFROMV$PROCESSWHEREADDR='剛才查到的PADDR';
4. 殺進(jìn)程(1).先殺ORACLE進(jìn)程:ALTERSYSTEMKILLSESSION'查出的SID,查出的SERIAL#';(2).再殺操作系統(tǒng)進(jìn)程:KILL-9剛才查出的SPID或ORAKILL剛才查出的SID剛才查出的SPID方法二:經(jīng)常在oracle的使用過程中碰到這個問題,所以也總結(jié)了一點解決方法:)1)查找死鎖的進(jìn)程:sqlplus"/assysdba"SELECT
s.username,l.
OBJECT_ID
,l.SESSION_ID,s.SERIAL#,l.ORACLE_USERNAME,l.OS_USER_NAME,l.PROCESSFROMV$LOCKED_OBJECTl,V$SESSIONSWHERE
l.SESSION_ID=
S.SID;2)kill掉這個死鎖的進(jìn)程:altersystemkillsession‘sid,serial#’;(其中sid=
l.session_id)3)如果還不能解決,
selectpro.spidfromv$sessionses,v$processprowhereses.sid=XXandses.paddr=pro.addr;其中sid用死鎖的sid替換。
所謂死鎖:是指兩個或兩個以上的進(jìn)程在執(zhí)行過程中,因爭奪資源而造成的一種互相等待的現(xiàn)象,若無外力作用,它們都將無法推進(jìn)下去。此時稱系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產(chǎn)生了死鎖,這些永遠(yuǎn)在互相等待的進(jìn)程稱為死鎖進(jìn)程。由于資源占用是互斥的,當(dāng)某個進(jìn)程提出申請資源后,使得有關(guān)進(jìn)程在無外力協(xié)助下,永遠(yuǎn)分配不到必需的資源而無法繼續(xù)運行,這就產(chǎn)生了一種特殊現(xiàn)象死鎖。雖然進(jìn)程在運行過程中,可能發(fā)生死鎖,但死鎖的發(fā)生也必須具備一定的條件,死鎖的發(fā)生必須具備以下四個必要條件。1)互斥條件:指進(jìn)程對所分配到的資源進(jìn)行排它性使用,即在一段時間內(nèi)某資源只由一個進(jìn)程占用。如果此時還有其它進(jìn)程請求資源,則請求者只能等待,直至占有資源的進(jìn)程用畢釋放。2)請求和保持條件:指進(jìn)程已經(jīng)保持至少一個資源,但又提出了新的資源請求,而該資源已被其它進(jìn)程占有,此時請求進(jìn)程阻塞,但又對自己已獲得的其它資源保持不放。3)不剝奪條件:指進(jìn)程已獲得的資源,在未使用完之前,不能被剝奪,只能在使用完時由自己釋放。4)環(huán)路等待條件:指在發(fā)生死鎖時,必然存在一個進(jìn)程——資源的環(huán)形鏈,即進(jìn)程集合{P0,P1,P2,···,Pn}中的P0正在等待一個P1占用的資源;P1正在等待P2占用的資源,……,Pn正在等待已被P0占用的資源。在系統(tǒng)中已經(jīng)出現(xiàn)死鎖后,應(yīng)該及時檢測到死鎖的發(fā)生,并采取適當(dāng)?shù)拇胧﹣斫獬梨i。目前處理死鎖的方法可歸結(jié)為以下四種:1) 預(yù)防死鎖。這是一種較簡單和直觀的事先預(yù)防的方法。方法是通過設(shè)置某些限制條件,去破壞產(chǎn)生死鎖的四個必要條件中的一個或者幾個,來預(yù)防發(fā)生死鎖。預(yù)防死鎖是一種較易實現(xiàn)的方法,已被廣泛使用。但是由于所施加的限制條件往往太嚴(yán)格,可能會導(dǎo)致系統(tǒng)資源利用率和系統(tǒng)吞吐量降低。2) 避免死鎖。該方法同樣是屬于事先預(yù)防的策略,但它并不須事先采取各種限制措施去破壞產(chǎn)生死鎖的的四個必要條件,而是在資源的動態(tài)分配過程中,用某種方法去防止系統(tǒng)進(jìn)入不安全狀態(tài),從而避免發(fā)生死鎖。3)檢測死鎖。這種方法并不須事先采取任何限制性措施,也不必檢查系統(tǒng)是否已經(jīng)進(jìn)入不安全區(qū),此方法允許系統(tǒng)在運行過程中發(fā)生死鎖。但可通過系統(tǒng)所設(shè)置的檢測機(jī)構(gòu),及時地檢測出死鎖的發(fā)生,并精確地確定與死鎖有關(guān)的進(jìn)程和資源,然后采取適當(dāng)措施,從系統(tǒng)中將已發(fā)生的死鎖清除掉。4)解除死鎖。這是與檢測死鎖相配套的一種措施。當(dāng)檢測到系統(tǒng)中已發(fā)生死鎖時,須將進(jìn)程從死鎖狀態(tài)中解脫出來。常用的實施方法是撤銷或掛起一些進(jìn)程,以便回收一些資源,再將這些資源分配給已處于阻塞狀態(tài)的進(jìn)程,使之轉(zhuǎn)為就緒狀態(tài),以繼續(xù)運行。死鎖的檢測和解除措施,有可能使系統(tǒng)獲得較好的資源利用率和吞吐量,但在實現(xiàn)上難度也最大。
處理死鎖的思路如下:
預(yù)防死鎖:破壞四個必要條件中的一個或多個來預(yù)防死鎖。
避免死鎖:在資源動態(tài)分配的過程中,用某種方式防止系統(tǒng)進(jìn)入不安全的狀態(tài)。
檢測死鎖:運行時產(chǎn)生死鎖,及時發(fā)現(xiàn)思索,將程序解脫出來。
解除死鎖:發(fā)生死鎖后,撤銷進(jìn)程,回收資源,分配給正在阻塞狀態(tài)的進(jìn)程。
預(yù)防死鎖的辦法:
破壞請求和保持條件:
1、一次性的申請所有資源。之后不在申請資源,如果不滿足資源條件則得不到資源分配。
2、只獲得初期資源運行,之后將運行完的資源釋放,請求新的資源。
破壞不可搶占條件:當(dāng)一個進(jìn)程獲得某種不可搶占資源,提出新的資源申請,若不能滿足,則釋放所有資源,以后需要,再次重新申請。
破壞循環(huán)等待條件:對資源進(jìn)行排號,按照序號遞增的順序請求資源。若進(jìn)程獲得序號高的資源想要獲取序號低的資源,就需要先釋放序號高的資源。
擴(kuò)展資料
形成死鎖的四個必要條件:
(1) 互斥條件:一個資源每次只能被一個進(jìn)程使用。
(2) 請求與保持條件:一個進(jìn)程因請求資源而阻塞時,對已獲得的資源保持不放。
(3) 不剝奪條件:進(jìn)程已獲得的資源,在末使用完之前,不能強(qiáng)行剝奪。
(4) 循環(huán)等待條件:若干進(jìn)程之間形成一種頭尾相接的循環(huán)等待資源關(guān)系。
如果一組進(jìn)程中每一個進(jìn)程都在等待僅由該組進(jìn)程中的其他進(jìn)程才能引發(fā)的事件,那么該組進(jìn)程是死鎖的。
舉例來說:有兩個進(jìn)程A和B,A持有資源a等待b資源,B持有資源b等待a資源,兩個進(jìn)程都在等待另一個資源的同時不釋放資源,就形成死鎖。
解除死鎖的方法有:
1、資源剝奪
產(chǎn)生死鎖的條件之一就是:資源不可剝奪。如果允許進(jìn)程可以剝奪其他進(jìn)程的資源,那么就可以使得一個進(jìn)程可以從其他進(jìn)程剝奪足夠的資源,從而解除死鎖狀態(tài)。
2、撤銷進(jìn)程
按照某種順序,撤銷進(jìn)程并釋放資源,直到釋放出足夠多的資源,并解除死鎖。最極端的情況就是,撤銷了所有進(jìn)程。
3、進(jìn)程回退
讓進(jìn)程回退到某個狀態(tài)(回退到?jīng)]有獲取某種資源的狀態(tài)),從而釋放已經(jīng)獲得的資源,這樣其他進(jìn)程就可以獲得因回退而被釋放的資源并解除死鎖狀態(tài)。
4、鴕鳥策略
假裝沒有發(fā)生死鎖,不管了。因為解除死鎖的代價非常高,所以就忽略死鎖。死鎖產(chǎn)生的本質(zhì)原因就是那兩個,但因為死鎖已經(jīng)發(fā)生了,所以只能從資源這一方向入手了。
什么是死鎖
當(dāng)兩個(或多個)用戶互相等待被對方加鎖的資源時就會發(fā)生死鎖(deadlock)。死鎖將導(dǎo)致相關(guān)的事務(wù)停止執(zhí)行。下圖演示了產(chǎn)生死鎖的兩個事務(wù)。
如圖所示,在時間點 A,兩個事務(wù)均獲得了更新操作所需數(shù)據(jù)行上的鎖,此時兩事務(wù)均正常,能夠繼續(xù)執(zhí)行。接下來,兩個事務(wù)均要更新當(dāng)前被對方加鎖的數(shù)據(jù)。因此,在時間點 B 將發(fā)生死鎖,因為此時兩個事務(wù)都不能獲得繼續(xù)執(zhí)行或終止所需的資源。無論兩個事務(wù)等待多久,相互沖突的鎖都無法被釋放,所以此種情況被稱為死鎖。
圖:產(chǎn)生死鎖的兩個事務(wù)
檢測死鎖
數(shù)據(jù)庫能自動地檢測死鎖的情況,回滾造成死鎖的某個語句,以便釋放沖突的行級鎖,從而解決死鎖問題。數(shù)據(jù)庫將向執(zhí)行了語句級回滾的事務(wù)返回一個錯誤信息。
避免死鎖
如果兩個事務(wù)需要訪問相同的一組表,那么在兩個事務(wù)中按相同的順序?qū)@組表加鎖通常能避免多表死鎖。例如,如果系統(tǒng)中的一個主表及一個明細(xì)表都需要更新時,開發(fā)者應(yīng)該遵從一定的規(guī)則,如先對主表加鎖,再對明細(xì)表加鎖。如果能夠仔細(xì)設(shè)計類似的規(guī)則并嚴(yán)格執(zhí)行,就能從根本上杜絕死鎖的產(chǎn)生。 如果開發(fā)者預(yù)先知道需要在同一事務(wù)內(nèi)對一系列資源加鎖,那么應(yīng)考慮首先對排他性最高的資源加鎖。
關(guān)于數(shù)據(jù)庫死鎖的檢查方法
一、數(shù)據(jù)庫死鎖的現(xiàn)象
程序在執(zhí)行的過程中,點擊確定或保存按鈕,程序沒有響應(yīng),也沒有出現(xiàn)報錯。
二、死鎖的原理
當(dāng)對于數(shù)據(jù)庫某個表的某一列做更新或刪除等操作,執(zhí)行完畢后該條語句不提
交,另一條對于這一列數(shù)據(jù)做更新操作的語句在執(zhí)行的時候就會處于等待狀態(tài),
此時的現(xiàn)象是這條語句一直在執(zhí)行,但一直沒有執(zhí)行成功,也沒有報錯。
三、死鎖的定位方法
通過檢查數(shù)據(jù)庫表,能夠檢查出是哪一條語句被死鎖,產(chǎn)生死鎖的機(jī)器是哪一臺。
1)用dba用戶執(zhí)行以下語句
select username,lockwait,status,machine,program from v$session where sid in
(select session_id from v$locked_object)
如果有輸出的結(jié)果,則說明有死鎖,且能看到死鎖的機(jī)器是哪一臺。字段說明:
Username:死鎖語句所用的數(shù)據(jù)庫用戶;
Lockwait:死鎖的狀態(tài),如果有內(nèi)容表示被死鎖。
Status: 狀態(tài),active表示被死鎖
Machine: 死鎖語句所在的機(jī)器。
Program: 產(chǎn)生死鎖的語句主要來自哪個應(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))
四、死鎖的解決方法
一般情況下,只要將產(chǎn)生死鎖的語句提交就可以了,但是在實際的執(zhí)行過程中。用戶可
能不知道產(chǎn)生死鎖的語句是哪一句。可以將程序關(guān)閉并重新啟動就可以了。
經(jīng)常在Oracle的使用過程中碰到這個問題,所以也總結(jié)了一點解決方法。
1)查找死鎖的進(jìn)程:
sqlplus "/as sysdba" (sys/change_on_install)
SELECT s.username,l.OBJECT_ID,l.SESSION_ID,s.SERIAL#,
l.ORACLE_USERNAME,l.OS_USER_NAME,l.PROCESS
FROM V$LOCKED_OBJECT l,V$SESSION S WHERE l.SESSION_ID=S.SID;
2)kill掉這個死鎖的進(jìn)程:
alter system kill session ‘sid,serial#’; (其中sid=l.session_id)
alter system kill session '710,35184'; (其中sid=l.session_id)
3)如果還不能解決:
select pro.spid from v$session ses,v$process pro where ses.sid=XX and ses.paddr=pro.addr;
其中sid用死鎖的sid替換: exit
ps -ef|grep spid
其中spid是這個進(jìn)程的進(jìn)程號,kill掉這個Oracle進(jìn)程
from:
select A.SQL_TEXT, B.USERNAME, C.OBJECT_ID, C.SESSION_ID,
B.SERIAL#, C.ORACLE_USERNAME,C.OS_USER_NAME,C.Process,
''''||C.Session_ID||','||B.SERIAL#||''''
from v$sql A, v$session B, v$locked_object C
where A.HASH_VALUE = B.SQL_HASH_VALUE and
B.SID = C.Session_ID
1.數(shù)據(jù)庫死鎖的現(xiàn)象程序在執(zhí)行的過程中,點擊確定或保存按鈕,程序沒有響應(yīng),也沒有出現(xiàn)報錯。
2.死鎖的原理當(dāng)對于數(shù)據(jù)庫某個表的某一列做更新或刪除等操作,執(zhí)行完畢后該條語句不提交,另一條對于這一列數(shù)據(jù)做更新操作的語句在執(zhí)行的...
3.死鎖的定位方法通過檢查數(shù)據(jù)庫表,能夠檢查出是哪一條語句被死鎖,產(chǎn)生死鎖的機(jī)器是哪一臺。 ...
4.死鎖的解決方法 一般情況下,只要將產(chǎn)生死鎖的語句提交就可以了,但是在實際的執(zhí)行過程中.