kup*_*upa 9 oracle locking wait-types
我有以下情况。
我有 RAC。在两个节点上都有锁。
SID EVENT USERNAME BLOCKING_SESSION ROW_WAIT_OBJ# OBJECT_NAME LOCKWAIT SQL_ID STATUS
1 102 enq: TX - row lock contention MYUSER 155 136972 TABLE1V 0000000810EFA958 5f4bzdg49fdxq ACTIVE
2 111 enq: TX - row lock contention MYUSER 155 136972 TABLE1V 0000000810EFAC98 5f4bzdg49fdxq ACTIVE
Run Code Online (Sandbox Code Playgroud)
SID EVENT USERNAME ROW_WAIT_OBJ# OBJECT_NAME LOCKWAIT SQL_ID STATUS
1 155 SQL*Net message from client MYUSER 136971 MyTABLEIMAGES_IDPK 4hw85z8absbjc INACTIVE
Run Code Online (Sandbox Code Playgroud)
SID EVENT USERNAME BLOCKING_SESSION ROW_WAIT_OBJ# OBJECT_NAME LOCKWAIT SQL_ID STATUS
1 65 enq: TX - row lock contention MYUSER 155 137033 FactTABLE1V 0000000810EF9B58 1mznc2z75ksdx ACTIVE
2 111 enq: TX - row lock contention MYUSER 155 136972 TABLE1V 0000000810EF9818 5f4bzdg49fdxq ACTIVE
Run Code Online (Sandbox Code Playgroud)
SID EVENT USERNAME ROW_WAIT_OBJ# OBJECT_NAME SQL_ID STATUS
1 155 SQL*Net message from client MYUSER 127176 MYTableLOG INACTIVE
Run Code Online (Sandbox Code Playgroud)
create or replace procedure ACTIONProcedureDELETE
(
p_ID NUMBER
)
is
cursor oldval is select r.id,r.sessionstatus
from MyTABLEIMAGES r where r.idparent=p_ID;
begin
update actionmyTableblock r set r.status='False' where ID=p_ID;
for oldvalItem in oldval loop
if oldvalItem.Sessionstatus='True' then
update MyTABLEIMAGES r set r.sessionstatus='False' where r.id=oldvalItem.Id;
else
update MyTABLEIMAGES r set r.sessionstatus='True' where r.id=oldvalItem.Id;
end if;
end loop;
end ACTIONProcedureDELETE;
Run Code Online (Sandbox Code Playgroud)
如您所见,阻塞会话处于非活动状态,但仍处于锁定状态。
如果我select v$sql_bind_capture
没有VALUE_STRING
阻止 session 的价值sql_id
。
我可以猜测缺少提交/回滚,但应用程序开发人员说“我一切正常,我已经在需要的地方写了提交”
请帮忙。
v$transaction
在每个节点上查询以查看未提交的会话:
SELECT t.start_time, s.sid, s.serial#, s.username, s.status,s.schemaname, s.osuser
, s.process, s.machine, s.terminal, s.program, s.module
, to_char(s.logon_time,'DD/MON/YY HH24:MI:SS') logon_time
FROM v$transaction t, v$session s
WHERE s.saddr = t.ses_addr
ORDER BY start_time;
Run Code Online (Sandbox Code Playgroud)
您可以通过使用 aSELECT FOR UPDATE
和WAIT X
or 或预先确保该行可用于更新来避免行锁争用NOWAIT
,例如:
create or replace procedure ACTIONProcedureDELETE (p_ID NUMBER)
is
cursor oldval is select r.id,r.sessionstatus
from MyTABLEIMAGES r where r.idparent=p_ID FOR UPDATE NOWAIT;
l_id NUMBER;
begin
select id into l_id from actionmyTableblock where ID=p_ID
FOR UPDATE of status NOWAIT;
update actionmyTableblock r set r.status='False' where ID=p_ID;
for oldvalItem in oldval loop
if oldvalItem.Sessionstatus='True' then
update MyTABLEIMAGES r set r.sessionstatus='False' where r.id=oldvalItem.Id;
else
update MyTABLEIMAGES r set r.sessionstatus='True' where r.id=oldvalItem.Id;
end if;
end loop;
end ACTIONProcedureDELETE;
Run Code Online (Sandbox Code Playgroud)
如果该行被锁定,您将收到一个 ORA-00054,这在大多数情况下比无限期等待更可取。
归档时间: |
|
查看次数: |
78943 次 |
最近记录: |