LOCK如何在COMMIT中幸存下来,或者如何将对LOCKed表所做的更改传播到另一个会话中,而无需COMMIT和丢失LOCK

时间:2018-10-18 11:15:13

标签: oracle transactions

我希望LOCK TABLE的时间比下一个COMMIT / ROLLBACK的时间长。

例如,我锁定了表,更正了它的状态,并希望随后更新其他表,但是我不想为其他表保留太长时间的锁,并且希望做很多COMMIT

因此,我将对其他表执行COMMIT / ROLLBACK,但仍然希望避免对基本表进行任何修改。

看来我需要打开两个数据库会话。将LOCK TABLE保留在一个表中,并处理另一个表。但是我不明白如何在不通过COMMIT关闭LOCK的情况下将更改传播到基表,因此它们将在另一个会话中可见。

1 个答案:

答案 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);

在测试之后不要忘记提交或回滚以释放锁。