create table parent (
p integer primary key,
descr varchar2(10),
created date,
updated date
)
Table created.
create table child (
c integer primary key,
p integer references parent (p),
descr varchar2(10),
created date,
updated date
)
Table created.
create sequence parent_seq
Sequence created.
create sequence child_seq
Sequence created.
begin
insert into parent (p, descr, created) values (parent_seq.nextval, 'p1', sysdate);
insert into child (c, p, descr, created) values (child_seq.nextval, parent_seq.currval, 'c1', sysdate);
commit;
end;
Statement processed.
Helper procedure for checking table locks in LiveSQL
create or replace procedure p_chk_tab_lock (p_table in varchar2)
as
pragma autonomous_transaction;
e_locked exception;
pragma exception_init (e_locked, -54);
begin
execute immediate 'lock table '||p_table||' in exclusive mode nowait';
rollback;
dbms_output.put_line('Table '||p_table||' is not locked.');
exception
when e_locked then
dbms_output.put_line('Table '||p_table||' is locked.');
end;
Procedure created.
TEST 1
create or replace trigger parent_trg
before insert or update on parent
for each row
begin
if inserting then
if :new.p is null then
:new.p := parent_seq.nextval; --> this row has impact, it will cause the child table to be locked !!!
end if;
:new.created := sysdate;
elsif
updating then
:new.updated := sysdate;
end if;
end;
Trigger created.
update parent
set descr = 'pp1'
where p = 1
1 row(s) updated.
begin
p_chk_tab_lock ('parent');
p_chk_tab_lock ('child');
end;
Statement processed.
Table parent is locked.
Table child is not locked.
rollback
Statement processed.
insert into parent (descr)
values ('p2')
1 row(s) inserted.
begin
p_chk_tab_lock ('parent');
p_chk_tab_lock ('child');
end;
Statement processed.
Table parent is locked.
Table child is locked.
rollback
Statement processed.
TEST 2
drop trigger parent_trg
Trigger dropped.
create or replace trigger parent_ins_trg
before insert on parent
for each row
begin
if :new.p is null then
:new.p := parent_seq.nextval; --> this row has impact, it will cause the child table to be locked !!!
end if;
:new.created := sysdate;
end;
Trigger created.
create or replace trigger parent_upd_trg
before update on parent
for each row
begin
:new.updated := sysdate;
end;
Trigger created.
update parent
set descr = 'pp1'
where p = 1
1 row(s) updated.
begin
p_chk_tab_lock ('parent');
p_chk_tab_lock ('child');
end;
Statement processed.
Table parent is locked.
Table child is not locked.
rollback
Statement processed.
insert into parent (descr)
values ('p2')
1 row(s) inserted.
begin
p_chk_tab_lock ('parent');
p_chk_tab_lock ('child');
end;
Statement processed.
Table parent is locked.
Table child is locked.
rollback
Statement processed.
create index child_ix_p on child(p)
Index created.
TEST 3
drop trigger parent_ins_trg
Trigger dropped.
drop trigger parent_upd_trg
Trigger dropped.
create or replace trigger parent_trg
before insert or update on parent
for each row
begin
if inserting then
if :new.p is null then
:new.p := parent_seq.nextval; --> this row has impact, it will cause the child table to be locked !!!
end if;
:new.created := sysdate;
elsif
updating then
:new.updated := sysdate;
end if;
end;
Trigger created.
update parent
set descr = 'pp1'
where p = 1
1 row(s) updated.
begin
p_chk_tab_lock ('parent');
p_chk_tab_lock ('child');
end;
Statement processed.
Table parent is locked.
Table child is locked.
rollback
Statement processed.
insert into parent (descr)
values ('p2')
1 row(s) inserted.
begin
p_chk_tab_lock ('parent');
p_chk_tab_lock ('child');
end;
Statement processed.
Table parent is locked.
Table child is locked.
rollback
Statement processed.
TEST 4
drop trigger parent_trg
Trigger dropped.
create or replace trigger parent_ins_trg
before insert on parent
for each row
begin
if :new.p is null then
:new.p := parent_seq.nextval; --> this row has impact, it will cause the child table to be locked !!!
end if;
:new.created := sysdate;
end;
Trigger created.
create or replace trigger parent_upd_trg
before update on parent
for each row
begin
:new.updated := sysdate;
end;
Trigger created.
update parent
set descr = 'pp1'
where p = 1
1 row(s) updated.
begin
p_chk_tab_lock ('parent');
p_chk_tab_lock ('child');
end;
Statement processed.
Table parent is locked.
Table child is not locked.
rollback
Statement processed.
insert into parent (descr)
values ('p2')
1 row(s) inserted.
begin
p_chk_tab_lock ('parent');
p_chk_tab_lock ('child');
end;
Statement processed.
Table parent is locked.
Table child is locked.
rollback
Statement processed.