概述:
鎖表是很容易發生的現象,當有多人對錶進行操做時就容易發生。以下是解決鎖表的步驟
鎖表緣由:
因爲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