oracle數(shù)據(jù)庫鎖表原因 oracle數(shù)據(jù)庫鎖表怎么解決?
oracle數(shù)據(jù)庫鎖表怎么解決?首先你要知道表鎖住了是不是正常鎖?因?yàn)槿魏蜠ML語句都會(huì)對(duì)表加鎖。你要先查一下是那個(gè)會(huì)話那個(gè)sql鎖住了表,有可能這是正常業(yè)務(wù)需求,不建議隨便KILLsession,如
oracle數(shù)據(jù)庫鎖表怎么解決?
首先你要知道表鎖住了是不是正常鎖?因?yàn)槿魏蜠ML語句都會(huì)對(duì)表加鎖。你要先查一下是那個(gè)會(huì)話那個(gè)sql鎖住了表,有可能這是正常業(yè)務(wù)需求,不建議隨便KILLsession,如果這個(gè)鎖表是正常業(yè)務(wù)你把sessionkill掉了會(huì)影響業(yè)務(wù)的。建議先查原因再做決定。(1)鎖表查詢的代碼有以下的形式:selectcount(*)fromv$locked_objectselect*fromv$locked_object(2)查看哪個(gè)表被鎖selectb.owner,b.object_name,a.session_id,a.locked_modefromv$locked_objecta,dba_objectsbwhereb.object_id=a.object_id(3)查看是哪個(gè)session引起的selectb.username,b.sid,b.serial#,logon_timefromv$locked_objecta,v$sessionbwherea.session_id=b.sidorderbyb.logon_time(4)查看是哪個(gè)sql引起的selectb.username,b.sid,b.serial#,c.*fromv$locked_objecta,v$sessionb,v$sqlcwherea.session_id=b.sidandb.SQL_ID=c.sql_idandc.sql_id=""orderbyb.logon_time(5)殺掉對(duì)應(yīng)進(jìn)程執(zhí)行命令:altersystemkillsession"1025,41"其中1025為sid,41為serial#.
oracle行級(jí)鎖和表級(jí)鎖的區(qū)別?
1. 程序中非數(shù)據(jù)庫交互操作導(dǎo)致事務(wù)掛起
將接口調(diào)用或者文件操作等這一類非數(shù)據(jù)庫交互操作嵌入在 SQL 事務(wù)代碼之中,那么整個(gè)事務(wù)很有可能因此掛起(接口不通等待超時(shí)或是上傳下載大附件)。
2. 事務(wù)中包含性能較差的查詢 SQL
事務(wù)中存在慢查詢,導(dǎo)致同一個(gè)事務(wù)中的其他 DML 無法及時(shí)釋放占用的行鎖,引起行鎖等待。
3. 單個(gè)事務(wù)中包含大量 SQL
通常是由于在事務(wù)代碼中加入 for 循環(huán)導(dǎo)致,雖然單個(gè) SQL 運(yùn)行很快,但是 SQL 數(shù)量一大,事務(wù)就會(huì)很慢。
4. 級(jí)聯(lián)更新 SQL 執(zhí)行時(shí)間較久
這類 SQL 容易讓人產(chǎn)生錯(cuò)覺,例如:update A set ... where ...in (select B) 這類級(jí)聯(lián)更新,不僅會(huì)占用 A 表上的行鎖,也會(huì)占用 B 表上的行鎖,當(dāng) SQL 執(zhí)行較久時(shí),很容易引起 B 表上的行鎖等待。
5. 磁盤問題導(dǎo)致的事務(wù)掛起
極少出現(xiàn)的情形,比如存儲(chǔ)突然離線,SQL 執(zhí)行會(huì)卡在內(nèi)核調(diào)用磁盤的步驟上,一直等待,事務(wù)無法提交。
綜上可以看出,如果事務(wù)長(zhǎng)時(shí)間未提交,且事務(wù)中包含了 DML 操作,那么就有可能產(chǎn)生行鎖等待,引起報(bào)錯(cuò)。
oracle經(jīng)常死鎖,鎖定數(shù)據(jù)庫的一些表,導(dǎo)致oracle死鎖的原因一般有那些?
一般情況只發(fā)生鎖超時(shí),就是一個(gè)進(jìn)程需要訪問數(shù)據(jù)庫表或者字段的時(shí)候,另外一個(gè)程序正在執(zhí)行帶鎖的訪問(比如修改數(shù)據(jù)),那么這個(gè)進(jìn)程就會(huì)等待,當(dāng)?shù)攘撕芫面i還沒有解除的話就會(huì)鎖超時(shí),報(bào)告一個(gè)系統(tǒng)錯(cuò)誤,拒絕執(zhí)行相應(yīng)的SQL操作。發(fā)生死鎖的情況比較少,比如一個(gè)進(jìn)程需要訪問兩個(gè)資源(數(shù)據(jù)庫表或者字段),當(dāng)獲取一個(gè)資源的時(shí)候進(jìn)程就對(duì)它執(zhí)行鎖定,然后等待下一個(gè)資源空閑,這時(shí)候如果另外一個(gè)進(jìn)程也需要兩個(gè)資源,而已經(jīng)獲得并鎖定了第二個(gè)資源,那么就會(huì)死鎖,因?yàn)楫?dāng)前進(jìn)程鎖定第一個(gè)資源等待第二個(gè)資源,而另外一個(gè)進(jìn)程鎖定了第二個(gè)資源等待第一個(gè)資源,兩個(gè)進(jìn)程都永遠(yuǎn)得不到滿足。
erp100.com