什么是死鎖
創(chuàng)新互聯(lián)公司公司2013年成立,先為山丹等服務(wù)建站,山丹等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢(xún)服務(wù)。為山丹企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
當(dāng)兩個(gè)(或多個(gè))用戶(hù)互相等待被對(duì)方加鎖的資源時(shí)就會(huì)發(fā)生死鎖(deadlock)。死鎖將導(dǎo)致相關(guān)的事務(wù)停止執(zhí)行。下圖演示了產(chǎn)生死鎖的兩個(gè)事務(wù)。
如圖所示,在時(shí)間點(diǎn) A,兩個(gè)事務(wù)均獲得了更新操作所需數(shù)據(jù)行上的鎖,此時(shí)兩事務(wù)均正常,能夠繼續(xù)執(zhí)行。接下來(lái),兩個(gè)事務(wù)均要更新當(dāng)前被對(duì)方加鎖的數(shù)據(jù)。因此,在時(shí)間點(diǎn) B 將發(fā)生死鎖,因?yàn)榇藭r(shí)兩個(gè)事務(wù)都不能獲得繼續(xù)執(zhí)行或終止所需的資源。無(wú)論兩個(gè)事務(wù)等待多久,相互沖突的鎖都無(wú)法被釋放,所以此種情況被稱(chēng)為死鎖。
圖:產(chǎn)生死鎖的兩個(gè)事務(wù)
檢測(cè)死鎖
數(shù)據(jù)庫(kù)能自動(dòng)地檢測(cè)死鎖的情況,回滾造成死鎖的某個(gè)語(yǔ)句,以便釋放沖突的行級(jí)鎖,從而解決死鎖問(wèn)題。數(shù)據(jù)庫(kù)將向執(zhí)行了語(yǔ)句級(jí)回滾的事務(wù)返回一個(gè)錯(cuò)誤信息。
避免死鎖
如果兩個(gè)事務(wù)需要訪(fǎng)問(wèn)相同的一組表,那么在兩個(gè)事務(wù)中按相同的順序?qū)@組表加鎖通常能避免多表死鎖。例如,如果系統(tǒng)中的一個(gè)主表及一個(gè)明細(xì)表都需要更新時(shí),開(kāi)發(fā)者應(yīng)該遵從一定的規(guī)則,如先對(duì)主表加鎖,再對(duì)明細(xì)表加鎖。如果能夠仔細(xì)設(shè)計(jì)類(lèi)似的規(guī)則并嚴(yán)格執(zhí)行,就能從根本上杜絕死鎖的產(chǎn)生。 如果開(kāi)發(fā)者預(yù)先知道需要在同一事務(wù)內(nèi)對(duì)一系列資源加鎖,那么應(yīng)考慮首先對(duì)排他性最高的資源加鎖。
關(guān)于數(shù)據(jù)庫(kù)死鎖的檢查方法
一、數(shù)據(jù)庫(kù)死鎖的現(xiàn)象
程序在執(zhí)行的過(guò)程中,點(diǎn)擊確定或保存按鈕,程序沒(méi)有響應(yīng),也沒(méi)有出現(xiàn)報(bào)錯(cuò)。
二、死鎖的原理
當(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用戶(hù)執(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ù)用戶(hù);
Lockwait:死鎖的狀態(tài),如果有內(nèi)容表示被死鎖。
Status: 狀態(tài),active表示被死鎖
Machine: 死鎖語(yǔ)句所在的機(jī)器。
Program: 產(chǎn)生死鎖的語(yǔ)句主要來(lái)自哪個(gè)應(yīng)用程序。
2)用dba用戶(hù)執(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))
四、死鎖的解決方法
一般情況下,只要將產(chǎn)生死鎖的語(yǔ)句提交就可以了,但是在實(shí)際的執(zhí)行過(guò)程中。用戶(hù)可
能不知道產(chǎn)生死鎖的語(yǔ)句是哪一句。可以將程序關(guān)閉并重新啟動(dòng)就可以了。
經(jīng)常在Oracle的使用過(guò)程中碰到這個(gè)問(wèn)題,所以也總結(jié)了一點(diǎn)解決方法。
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掉這個(gè)死鎖的進(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是這個(gè)進(jìn)程的進(jìn)程號(hào),kill掉這個(gè)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
-- 死鎖查詢(xún)語(yǔ)句
SELECT bs.username "Blocking User", bs.username "DB User",
ws.username "Waiting User", bs.SID "SID", ws.SID "WSID",
bs.serial# "Serial#", bs.sql_address "address",
bs.sql_hash_value "Sql hash", bs.program "Blocking App",
ws.program "Waiting App", bs.machine "Blocking Machine",
ws.machine "Waiting Machine", bs.osuser "Blocking OS User",
ws.osuser "Waiting OS User", bs.serial# "Serial#",
ws.serial# "WSerial#",
DECODE (wk.TYPE,
'MR', 'Media Recovery',
'RT', 'Redo Thread',
'UN', 'USER Name',
'TX', 'Transaction',
'TM', 'DML',
'UL', 'PL/SQL USER LOCK',
'DX', 'Distributed Xaction',
'CF', 'Control FILE',
'IS', 'Instance State',
'FS', 'FILE SET',
'IR', 'Instance Recovery',
'ST', 'Disk SPACE Transaction',
'TS', 'Temp Segment',
'IV', 'Library Cache Invalidation',
'LS', 'LOG START OR Switch',
'RW', 'ROW Wait',
'SQ', 'Sequence Number',
'TE', 'Extend TABLE',
'TT', 'Temp TABLE',
wk.TYPE
) lock_type,
DECODE (hk.lmode,
0, 'None',
1, 'NULL',
2, 'ROW-S (SS)',
3, 'ROW-X (SX)',
4, 'SHARE',
5, 'S/ROW-X (SSX)',
6, 'EXCLUSIVE',
TO_CHAR (hk.lmode)
) mode_held,
DECODE (wk.request,
0, 'None',
1, 'NULL',
2, 'ROW-S (SS)',
3, 'ROW-X (SX)',
4, 'SHARE',
5, 'S/ROW-X (SSX)',
6, 'EXCLUSIVE',
TO_CHAR (wk.request)
) mode_requested,
TO_CHAR (hk.id1) lock_id1, TO_CHAR (hk.id2) lock_id2,
DECODE
(hk.BLOCK,
0, 'NOT Blocking', /**//* Not blocking any other processes */
1, 'Blocking', /**//* This lock blocks other processes */
2, 'Global', /**//* This lock is global, so we can't tell */
TO_CHAR (hk.BLOCK)
) blocking_others
FROM v$lock hk, v$session bs, v$lock wk, v$session ws
WHERE hk.BLOCK = 1
AND hk.lmode != 0
AND hk.lmode != 1
AND wk.request != 0
AND wk.TYPE(+) = hk.TYPE
AND wk.id1(+) = hk.id1
AND wk.id2(+) = hk.id2
AND hk.SID = bs.SID(+)
AND wk.SID = ws.SID(+)
AND (bs.username IS NOT NULL)
AND (bs.username 'SYSTEM')
AND (bs.username 'SYS')
ORDER BY 1;
查詢(xún)發(fā)生死鎖的select語(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)
)
下面查詢(xún)可以查到死鎖,但是注意其實(shí)查詢(xún)到的不是真正的死鎖,查詢(xún)到的只是是死鎖發(fā)生前的等待條件,真正的死鎖在10G中會(huì)被系統(tǒng)所阻止掉
select t2.username||' '||t2.sid||' '||t2.serial#||' '||t2.logon_time||' '||t3.sql_text
from v$locked_object t1,v$session t2,v$sqltext t3
where t1.session_id=t2.sid
and t2.sql_address=t3.address
order by t2.logon_time ;
此外,從V$LOCK的BLOCK字段可以看到,BLOCK0表示有等待發(fā)生了,注意是行級(jí)等待,而在表級(jí)沒(méi)有死鎖或等待
select * from v$lock where block0 ;
1.數(shù)據(jù)庫(kù)死鎖的現(xiàn)象程序在執(zhí)行的過(guò)程中,點(diǎn)擊確定或保存按鈕,程序沒(méi)有響應(yīng),也沒(méi)有出現(xiàn)報(bào)錯(cuò)。
2.死鎖的原理當(dāng)對(duì)于數(shù)據(jù)庫(kù)某個(gè)表的某一列做更新或刪除等操作,執(zhí)行完畢后該條語(yǔ)句不提交,另一條對(duì)于這一列數(shù)據(jù)做更新操作的語(yǔ)句在執(zhí)行的...
3.死鎖的定位方法通過(guò)檢查數(shù)據(jù)庫(kù)表,能夠檢查出是哪一條語(yǔ)句被死鎖,產(chǎn)生死鎖的機(jī)器是哪一臺(tái)。 ...
4.死鎖的解決方法 一般情況下,只要將產(chǎn)生死鎖的語(yǔ)句提交就可以了,但是在實(shí)際的執(zhí)行過(guò)程中.
標(biāo)題名稱(chēng):如何定位oracle死鎖,oracle 鎖定
新聞來(lái)源:http://jinyejixie.com/article44/dsecshe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶(hù)體驗(yàn)、標(biāo)簽優(yōu)化、品牌網(wǎng)站建設(shè)、品牌網(wǎng)站制作、網(wǎng)站導(dǎo)航、服務(wù)器托管
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)