一次oracle行級鎖導致的問題

賀子_DBA時代發表於2015-04-12
發現問題:今天開發同事讓給修改一行資料的某幾個欄位,非常之簡單的操作,確因為對oracle鎖機制的理解不到位導致問題。
我同時用plsql/developer 和CRT兩種工具都連線上了資料庫,然後打算在plsql/developer上update一個欄位,在CRT上update一個欄位(我也不知道當時是怎麼想的,哈哈)然後就莫名其妙的夯住了。。。。。由於自己經驗和學識不足,還傻傻的等待中,還以為是資料量太大呢,原來是鎖的原因,
分析問題:我在plsql/developer是用的system使用者連線的資料庫,而在crt用  sqlplus / as  sysdba 連線資料庫,是sys使用者。現在在plsql/developer中update了一個欄位,沒有commit,就直接在CRT上update了另一個欄位,導致後者等待,應為已經有了行級鎖,
解決問題:
.1、 用dba許可權的使用者檢視資料庫都有哪些鎖

select a.username,a.sid,a.serial#,a.logon_time
from v$locked_object b,v$session a
where b.session_id=a.sid order by a.logon_time;

.2、根據sid檢視具體的sql語句,如果sql不重要,可以kill
select sql_text from v$session a,v$sqltext_with_newlines b
  where DECODE(a.sql_hash_value, 0, prev_hash_value, sql_hash_value)=b.hash_value
  and a.sid=&sid order by piece;
3、kill該事務
alter system kill session '339,13545';
然後再次執行update,最好用同一個使用者執行,非常快的執行了。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29654823/viewspace-1569954/,如需轉載,請註明出處,否則將追究法律責任。

相關文章