присутствует в Postgres?
То есть там я могу указать
begin
insert into tab1(id, value) values ....
end;
И в этот момент таблица блокируется на чтение и запись во второй сессии, пока не отработает END.
Можно ли в Оракл осуществить то же самое?
То есть явно заблокировать таблицу на чтение и запись для других сессий. После сделать все операции и разблокировать таблицу?
на запись можно, на чтение нельзя, но в целом вы хотите странного
Ситуация в том, что практически одновременно запускается один и тот же анонимный блок. Он вставляет одинаковые данные в одну таблицу. Разница между запусками блока 0.000002 секунд. В селекте есть exist not. То есть вставлять эти данные, если их нет в таблице. Сессии отрабатывают так, что обращаются к таблице и обе не видят данные. Соответственно, после вставляют одинаковые данные и в таблице появляются дубли
есть такое понятие в оракл как согласованное чтение,сессия данные в таблице видит на момент запуска запроса
Да, я это понимаю. Она видит слепок данных, но незаконченные изменения первой сессии не видит
и даже закоммиченные изменения не увидит, если они были сделаны после момента запуска запроса
Я вот и прошу помощи, чтобы разобраться, как сделать так, чтобы вторая сессия увидела данные
select for update
Читайте про уровни изоляции в оракле. Read commited по дефолту. Управлять можно параметром isolation level. Но зачем? Может у ас что-то с логикой приложения не так?
Почитайте про пользовательские блокировки через dbms_lock и блокируйте процесс, а не инсерт
Обсуждают сегодня