oracle怎么看是否鎖表 oracle行級鎖和表級鎖的區(qū)別?
oracle行級鎖和表級鎖的區(qū)別?1. 程序中非數(shù)據(jù)庫交互操作導致事務掛起將接口調用或者文件操作等這一類非數(shù)據(jù)庫交互操作嵌入在 SQL 事務代碼之中,那么整個事務很有可能因此掛起(接口不通等待超時或是
oracle行級鎖和表級鎖的區(qū)別?
1. 程序中非數(shù)據(jù)庫交互操作導致事務掛起
將接口調用或者文件操作等這一類非數(shù)據(jù)庫交互操作嵌入在 SQL 事務代碼之中,那么整個事務很有可能因此掛起(接口不通等待超時或是上傳下載大附件)。
2. 事務中包含性能較差的查詢 SQL
事務中存在慢查詢,導致同一個事務中的其他 DML 無法及時釋放占用的行鎖,引起行鎖等待。
3. 單個事務中包含大量 SQL
通常是由于在事務代碼中加入 for 循環(huán)導致,雖然單個 SQL 運行很快,但是 SQL 數(shù)量一大,事務就會很慢。
4. 級聯(lián)更新 SQL 執(zhí)行時間較久
這類 SQL 容易讓人產生錯覺,例如:update A set ... where ...in (select B) 這類級聯(lián)更新,不僅會占用 A 表上的行鎖,也會占用 B 表上的行鎖,當 SQL 執(zhí)行較久時,很容易引起 B 表上的行鎖等待。
5. 磁盤問題導致的事務掛起
極少出現(xiàn)的情形,比如存儲突然離線,SQL 執(zhí)行會卡在內核調用磁盤的步驟上,一直等待,事務無法提交。
綜上可以看出,如果事務長時間未提交,且事務中包含了 DML 操作,那么就有可能產生行鎖等待,引起報錯。
oracle經常死鎖,鎖定數(shù)據(jù)庫的一些表,導致oracle死鎖的原因一般有那些?
一般情況只發(fā)生鎖超時,就是一個進程需要訪問數(shù)據(jù)庫表或者字段的時候,另外一個程序正在執(zhí)行帶鎖的訪問(比如修改數(shù)據(jù)),那么這個進程就會等待,當?shù)攘撕芫面i還沒有解除的話就會鎖超時,報告一個系統(tǒng)錯誤,拒絕執(zhí)行相應的SQL操作。發(fā)生死鎖的情況比較少,比如一個進程需要訪問兩個資源(數(shù)據(jù)庫表或者字段),當獲取一個資源的時候進程就對它執(zhí)行鎖定,然后等待下一個資源空閑,這時候如果另外一個進程也需要兩個資源,而已經獲得并鎖定了第二個資源,那么就會死鎖,因為當前進程鎖定第一個資源等待第二個資源,而另外一個進程鎖定了第二個資源等待第一個資源,兩個進程都永遠得不到滿足。
erp100.com
oracle表在什么情況下會被鎖???
在對指定表做append操作,其他再做truncate時候,會產生鎖表,如下驗證步驟,1、創(chuàng)建測試表,create table test_lock(id number, value varchar2(200))2、執(zhí)行append語句;并且不做提交,insert /* append*/ into test_lock values(1,1)3、再次執(zhí)行清表語句,truncate table test_lock報鎖表錯誤,4、查看鎖表語句,發(fā)現(xiàn)被鎖表,select b.object_name, t.* from v$locked_object t, user_objects b where t.object_id = b.object_id
查看oracle是否鎖表之后。然后如果我沒有DBA權限,怎么殺掉進程或者解鎖表?
第一種:SQL>selectsession_idfromv$locked_object49SQL>SELECTsid,serial#,usernameFROMv$sessionwheresid=4949554systemSQL>ALTERSYSTEMKILLSESSION"49,554"第二種:如果用的是客戶端登錄,直接關掉客戶端就可以了,因為你的客戶端也是個session普通用戶也可以,因為是你這個用戶開啟這個進程,那么你也可以關閉這個進程