Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 锁如何在提交后仍然有效,或者如何将对锁定表的更改传播到另一个会话而不提交和丢失锁_Oracle_Transactions - Fatal编程技术网

Oracle 锁如何在提交后仍然有效,或者如何将对锁定表的更改传播到另一个会话而不提交和丢失锁

Oracle 锁如何在提交后仍然有效,或者如何将对锁定表的更改传播到另一个会话而不提交和丢失锁,oracle,transactions,Oracle,Transactions,我希望锁定表的时间长于下一次提交/回滚 例如,我锁定了表,更正了它的状态,并希望随后更新其他表,但我不想对其他表保持太长时间的锁定,并希望执行大量的提交 所以我将对其他表执行COMMIT/ROLLBACK,但仍然希望防止对基表进行任何修改 看起来我需要向DB打开两个会话。将锁表保留在一个中,并在另一个中处理表。但我不明白如何在不关闭锁的情况下通过COMMIT将更改传播到基表,以便它们在另一个会话中可见。下面是一个使用自治事务的示例 drop table EX_EMPLOYEE / drop ta

我希望
锁定表
的时间长于下一次
提交
/
回滚

例如,我锁定了表,更正了它的状态,并希望随后更新其他表,但我不想对其他表保持太长时间的锁定,并希望执行大量的
提交

所以我将对其他表执行
COMMIT
/
ROLLBACK
,但仍然希望防止对基表进行任何修改


看起来我需要向DB打开两个会话。将
锁表
保留在一个中,并在另一个中处理表。但我不明白如何在不关闭锁的情况下通过
COMMIT
将更改传播到基表,以便它们在另一个会话中可见。

下面是一个使用
自治事务的示例

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;
/
在两个表上完成选择后,您会注意到第一个表仍然包含该行,而第二个表中的行被删除

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

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

您可以在
autonomy\u TRANSACTION
s中执行后续更改,也可以使用
保存点
s。。。这里有一个好的开始:自治的_事务pragma改变了子程序在事务中的工作方式。标记有此pragma的子程序可以执行SQL操作并提交或回滚这些操作,而无需提交或回滚主事务中的数据。感谢您为编写此内容所做的努力!我有意地需要保持一个表处于一致状态,而另一个表应该在不干扰主要业务逻辑的情况下进行处理。我将标记失败并在以后处理它们,很可能在另一个时间范围内,这些记录将不存在事务,我将成功。