解決Oracle鎖表

概述:
鎖表是很容易發生的現象,當有多人對錶進行操做時就容易發生。以下是解決鎖表的步驟

鎖表緣由:
因爲Oracle數據庫具備保持數據的一致性,因此當一我的對錶進行操做,沒有提交,另外一我的在須要操做的時候,就不能操做,必須等表提交,就一直處於等待狀態,就致使鎖表。

鎖表報錯信息:   
若是發現修改一個表數據時不能提交而報下面的錯誤:
Record is locked by another user

解決方法:   
殺死會話進程或者再執行sql語句,而後提交。

解決步驟:
1. 登錄數據庫,以sys用戶登錄
SQL> conn /as sysdba
Connected.
SQL>
SQL>
SQL>
2. 查詢哪些會話被鎖。
SQL> select t2.username, t2.sid, t2.serial, t2.logon_time from v$locked_object t1,v$session t2 where t1.session_id=t2.sid order by t2.logon_time;


USERNAME                              SID    SERIAL LOGON_TIME
------------------------------ ---------- ---------- -------------------
IPMS                                  494      10320 2014-01-23 08:03:38
IPMS                                  479      25009 2014-01-23 08:04:50
HCBA                                  401      59957 2014-01-23 08:43:23


SQL>
SQL>
SQL>
2.1. 查看會話具體內容
SQL> 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;
Enter value for sid: 494  ------     (在此輸入sid號)
old   1: 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
new   1: 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=494 order by piece


SQL_TEXT
----------------------------------------------------------------
UPDATE IPMS.IS_STANDARD D  SET D.IS_LOCKCOUNT = D.IS_LOCKCOUNT -


                        (SELECT SUM(M.IM_APPLYNUM)




                 FROM IS_MATERIALAPPLY M




    WHERE M.IM_GBID IN
                                (SELECT




SQL_TEXT
----------------------------------------------------------------
G.IGB_ID
                                   FROM IPMS.IS_GRANTB


ILL G  INNER JOIN IPMS.WWF_INSTANCE I ON G.IGB_FLOWID =  I.INSTA
NCE_ID
                                  WHERE I.INSTANCE_ID=:I


NSTANCE_ID)
                            AND D.IM_ID = M.IM_ID


                            AND D.IS_LOCK = 1


SQL_TEXT
----------------------------------------------------------------




        )


10 rows selected.
2.2 查詢會話具體內容
SQL> 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;
Enter value for sid: 479(在此輸入sid號)
old   1: 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
new   1: 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=479 order by piece


SQL_TEXT
----------------------------------------------------------------
begin
  sys.dbms_output.get_line(line => :line, status => :statu


s);
end;



3. 殺死該會話
根據剛纔查詢出來的sid號和serial值。

SQL>
SQL> alter system kill session '494,10320';


System altered.


SQL> alter system kill session '479,25009';


System altered.


SQL> commit;


Commit complete.


SQL>sql

相關文章
相關標籤/搜索