我希望LOCK TABLE
的时间比下一个COMMIT
/ ROLLBACK
的时间长。
例如,我锁定了表,更正了它的状态,并希望随后更新其他表,但是我不想为其他表保留太长时间的锁,并且希望做很多COMMIT
。
因此,我将对其他表执行COMMIT
/ ROLLBACK
,但仍然希望避免对基本表进行任何修改。
看来我需要打开两个数据库会话。将LOCK TABLE
保留在一个表中,并处理另一个表。但是我不明白如何在不通过COMMIT
关闭LOCK的情况下将更改传播到基表,因此它们将在另一个会话中可见。
答案 0 :(得分:1)
以下是使用AUTONOMOUS_TRANSACTION
drop table EX_EMPLOYEE
/
drop table EX_EMPLOYEE1
/
create table EX_EMPLOYEE
(id number(4) null)
/
create table EX_EMPLOYEE1
(id number(4) null)
/
insert into EX_EMPLOYEE (id) values(1);
/
insert into EX_EMPLOYEE1 (id) values(1);
/
commit
/
create or replace procedure P_TEST
as
begin
DELETE FROM EX_EMPLOYEE WHERE ID =1;
P_TEST1();
end;
/
create or replace procedure P_TEST1
as
PRAGMA AUTONOMOUS_TRANSACTION;
begin
DELETE FROM EX_EMPLOYEE1 WHERE ID =1;
commit;
end;
/
然后执行过程
begin
P_TEST();
end;
/
在2个表上完成选择后,您会注意到第一个表仍包含该行,但是第二个表已删除。
select * from ex_employee where id =1;
select * from ex_employee1 where id =1;
您还可以从数据库中检查表是否仍被锁定:
SELECT * FROM V$LOCKED_OBJECT L
INNER JOIN USER_OBJECTS U ON(L.OBJECT_ID=U.OBJECT_ID);
在测试之后不要忘记提交或回滚以释放锁。