Как LOCK может пережить COMMIT или как изменения в LOCKed таблице могут быть распространены на другой сеанс без COMMIT и без потери LOCK - PullRequest
0 голосов
/ 18 октября 2018

Я хочу LOCK TABLE дольше, чем к следующему COMMIT / ROLLBACK.

Например, я заблокировал таблицу, исправил ее состояние и хочу впоследствии обновить другие таблицы, но не хочуслишком долго сохранять блокировки для других таблиц и ожидать много COMMIT.

Поэтому я сделаю COMMIT / ROLLBACK для других таблиц, но все же хочу предотвратить любые изменения базовой таблицы.

Похоже, мне нужно открыть две сессии для БД.Держите LOCK TABLE в одной и обрабатывайте таблицы в другой.Но я не понимаю, как я могу распространять изменения в базовой таблице, не закрывая LOCK на COMMIT, чтобы они были видны в другом сеансе.

1 Ответ

0 голосов
/ 18 октября 2018

Вот пример использования 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);

Не забудьте после этого тестасовершить или откатить, чтобы снять блокировку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...