在oracle中,鎖表的原因是當一個程序執行了對一個表的insert,并且還未commite時,另一個程序也對同一個表進行insert,則此時就會發生資源正忙的異常,也就是鎖表。
本教程操作環境:Windows10系統、Oracle 11g版、Dell G3電腦。
oracle鎖表的原因是什么
主要的鎖表原因有:?
(1) A程序執行了對 tableA 的 insert ,并還未 commite時,B程序也對tableA 進行insert 則此時會發生資源正忙的異常 就是鎖表
(2)鎖表常發生于并發而不是并行(并行時,一個線程操作數據庫時,另一個線程是不能操作數據庫的,cpu 和i/o 分配原則)
減少鎖表的概率方法:
(1)減少insert 、update 、delete 語句執行 到 commite 之間的時間。具體點批量執行改為單個執行、優化sql自身的非執行速度
(2)如果異常對事物進行回滾
鎖表原因可能是修改了行數據,忘了提交,也會造成鎖表。
一. 鎖表建議先查原因再做決定。
1鎖表查詢的代碼有以下的形式:
select?count(*)?from?v$locked_object; select?*?from?v$locked_object;
2.查看哪個表被鎖
select?b.owner,b.object_name,a.Session_id,a.locked_mode?from?v$locked_object?a,dba_objects?b?where?b.object_id?=?a.object_id;
3查看是哪個session引起的
select?b.username,b.sid,b.serial#,logon_time?from?v$locked_object?a,v$session?b?where?a.session_id?=?b.sid?order?by?b.logon_time;
4.查看是哪個sql引起的
select?b.username,b.sid,b.serial#,c.*?from?v$locked_object?a,v$session?b,v$sql?c?where?a.session_id?=?b.sid and?b.SQL_ID?=?c.sql_id?and?c.sql_id?=?'' order?by?b.logon_time;
5.殺掉對應進程
執行命令:alter system kill session’1025,41′;
其中1025為sid,41為serial#.
二. Oracle 用戶經常被鎖原因
在登陸時提示:test用戶被鎖
1、用dba角色的用戶登陸,進行解鎖,先設置具體時間格式,以便查看具體時間
SQL>?alter?session?set?nls_date_format=‘yyyy-mm-dd?hh24:mi:ss’;
Session altered.
2、查看具體的被鎖時間
SQL>?select?username,lock_date?from?dba_users?where?username='TEST'; USERNAME?LOCK_DATE ------------------------------?------------------- TEST?2021-03-10?08:51:03
3、解鎖
SQL>?alter?user?test?account?unlock;
User altered.
推薦教程:《Oracle視頻教程》