Допустим, у меня есть код, подобный следующему:
begin
select ... from T where x = 42; -- (1)
.
.
.
update T ... where x = 42; -- (2)
commit;
end;
Правильно ли я сказал, что к моменту выполнения (2) все, что было выбрано из T в (1), может уже не быть в T, если, например, в другом сеансе выполняется следующее:
delete from T where x = 42;
Если это так, то я бы хотел, чтобы оператор select блокировал T
, поэтому его нельзя изменить.
Я понимаю, что могу сделать это явно, выполнив:
lock table T in exclusive mode;
Но что, если T
- это представление? Должен ли я просматривать определение T
s view / subviews, чтобы найти все таблицы, на которые он ссылается, и заблокировать их по отдельности, или я могу сделать что-то вроде этого:
begin
START_TRANSACTION;
select ... from T where x = 42; -- (1)
.
.
.
update T ... where x = 42; -- (2)
commit;
end;
Где START_TRANSACTION
обеспечивает блокировку всех таблиц, упомянутых во всех операторах выбора, до завершения транзакции?
Или есть еще более приятное решение этой проблемы? Я использую Oracle 10g, если это важно.