oracle鎖表問題

2021-09-26 04:24:28 字數 1298 閱讀 1791

參考:

查詢被鎖表的sid等資訊

select t2.username,

t2.sid,

t2.serial#,

t3.object_name,

t2.osuser,

t2.machine,

t2.program,

t2.logon_time,

t2.command,

t2.lockwait,

t2.saddr,

t2.paddr,

t2.taddr,

t2.sql_address,

t1.locked_mode

from v$locked_object t1, v$session t2, dba_objects t3

where t1.session_id = t2.sid

and t1.object_id = t3.object_id

order by t2.logon_time;

根據sid獲取 導致鎖表的sql語句

select b.sql_text

from v$session a, v$sql b

where a.sid = 9591 --session_id

and a.sql_address = b.address(+)

根據sid解除鎖

alter system kill session 'sid,serial#';
insert鎖表問題:

主鍵用的是序列,insert不會鎖表,再高的併發都不會,它鎖的是當前序列好,如果insert id = 1,還沒有commit,他鎖的是當前序列號,即序列號為1,如果在commit之前又有了一條資料,序列號會自動為2,這個時候,id=1 回退,序列號不會跟著回退。

死鎖的情況:兩個insert語句同時試圖向乙個表中插入pk或unique值相同的資料(在主鍵列中插入同乙個資料,如都插入id=1),而造成其中會話被阻塞,等待其它會話提交或回滾,因而造成死鎖。這種情況,只要其中任何乙個session提交,另外乙個就會報出ora-00001:違反唯一性約束條件,死鎖終止;或者其中乙個session回滾,另外乙個即可正常執行,這可以就引證了上面的解釋,先把id=1 鎖列鎖住了,又要去插入一條id=1的資料,肯定不行撒。

個人總結:

如何沒主鍵,insert應該是不存在鎖的。只有存在主鍵的時候,才會有鎖,如果主鍵是自增序列,高併發下也不會有問題,如果不是序列,可以保證主鍵都會不一樣,也沒問題,平時uuid用的多,如果高併發下,uuid有重複的值,就會出現問題。

oracle表鎖問題

系統症狀使用者新增資料無法新增,日誌正常輸出,sql指令碼直接在資料庫執行,等待。判斷可能是開發操作表後沒有commit 通過alter system kill session命令結束程序 alter system kill session 6976,33967 查詢鎖物件 select alter...

oracle 鎖表問題

oracle執行表資料更新的時候,會遇到鎖表問題,比方說,會遇到 這樣的問題,主要原因是這張表被其他人占用,修改資料沒有提交。oracle為了避免髒資料的產生,在其安全機制下,鎖住該錶。執行如下操作,select t2.username,t2.sid,t2.serial t2.logon time ...

ORACLE解決鎖表問題

下面3個語句是我經常使用來解決oracle鎖問題的 注意你的使用者有沒有許可權問題 1.檢視被鎖的表 select p.spid,a.serial c.object name,b.session id,b.oracle username,b.os user name from v process p...