Kann ein Abzug verriegelt werden? wie würde man feststellen, dass es ist?
Bei der BeantwortungVerpasse ich Änderungen, wenn ich einen Orakelauslöser ersetze, während meine Anwendung ausgeführt wird?Ich habe nachgesehen, ob der Trigger durch eine INSERT-Anweisung gesperrt wurde. Es war nicht so und ich kann im Internet nichts finden, was darauf hindeutet, dass ein Abzug gesperrt werden kann.
Wenn ich in einer Sitzung Folgendes ausführe:
create table test_trigger (id number);
create table test_trigger_h (id number);
create or replace trigger test_trigger_t
after insert on test_trigger for each row
begin
insert into test_trigger_h (id) values (:new.id);
end;
/
insert into test_trigger
select level
from dual
connect by level <= 1000000;
und dann in einer zweiten Sitzung versuchen, herauszufinden, welche Sperren auftreten, bekomme ich Folgendes:
select object_name, object_type
, case l.block
when 0 then 'Not Blocking'
when 1 then 'Blocking'
when 2 then 'Global'
end as status
, case v.locked_mode
when 0 then 'None'
when 1 then 'Null'
when 2 then 'Row-S (SS)'
when 3 then 'Row-X (SX)'
when 4 then 'Share'
when 5 then 'S/Row-X (SSX)'
when 6 then 'Exclusive'
else to_char(lmode)
end as mode_held
from v$locked_object v
join dba_objects d
on v.object_id = d.object_id
join v$lock l
on v.object_id = l.id1
join v$session s
on v.session_id = s.sid
;
OBJECT_NAME OBJECT_TYPE STATUS MODE_HELD
-------------------- -------------------- --------------- ---------------
TEST_TRIGGER TABLE Not Blocking Row-X (SX)
TEST_TRIGGER_H TABLE Not Blocking Row-X (SX)
Laut Oracle ist der Auslösernicht gesperrt werden.
Wenn ich jedoch versuche, den Trigger zu ersetzen, während die INSERT-Anweisung ausgeführt wird, wird er erst ersetzt, nachdem die Anweisung abgeschlossen wurde (ohne Commit), was impliziert, dass der Trigger ausgeführt wirdist verschlossen.
Ist in dieser Situation der Abzug gesperrt und wenn ja, wie würde man feststellen, dass dies der Fall ist?