select for update

sevasel
Дата: 13.10.2015 15:17:14
пишу процедуру и туплю.

надо выбрать записи через блокировку select for update в курсор и обработать,
потом например перелить спустя время обработки этот же набор в другую таблицу
снова выбрав по тем же параметрам.

вопрос: будет ли повторяемое чтение? или что нужно сделать что бы было повторяемое чтение?

можно конечно по одной записи из курсора. но зачем.
Dimitry Sibiryakov
Дата: 13.10.2015 15:25:30

sevasel
или что нужно сделать что бы было повторяемое чтение?

Уровень изоляции транзакции выше чем Read Committed.

Posted via ActualForum NNTP Server 1.5

sevasel
Дата: 13.10.2015 15:42:04
Dimitry Sibiryakov, с помощью на уровне процедуры это можно сделать только с помощью ALTER SESSION SET ISOLATION LEVEL? но там вариантов..SERIALIZABLE / READ ONLY / READ COMMITTED
Den89
Дата: 13.10.2015 15:45:52
sevasel
вопрос: будет ли повторяемое чтение? или что нужно сделать что бы было повторяемое чтение?

Для повторяемого чтения можно использовать один и тот же SCN. Flashback query технология называется.
JDS
Дата: 13.10.2015 15:49:33
Интересен пример из жизни, когда такое может понадобиться? Какая задача изначально?
Dimitry Sibiryakov
Дата: 13.10.2015 15:55:58

sevasel
но там вариантов..SERIALIZABLE / READ ONLY / READ COMMITTED

Ну, нету SNAPSHOT, шо поделаешь. Используй что есть.

Posted via ActualForum NNTP Server 1.5

andzhi4
Дата: 13.10.2015 15:56:19
Ну выше read committed то только serializable, а оно скорее всего грохнется с ORA-08177, а рид онли тут видимо не катит.
Имхо, можно по ПК, типа:

declare
...
cursor cur1 is select ID from t1 for update skip locked;
ids ids_type; -- надо создать на уровне схемы
begin
open cur1;
fetch cur1 bulk collect into ids; --limit по желанию/необходимости
/*обработка*/
merge into t2 using 
  (select * from t1 where id in select column_value from table(ids) )
...
commit;
close cur1;
...


Без претензии на красивую реализацию, протсо на уровне идеи :)
sevasel
Дата: 13.10.2015 16:01:41
JDS, есть таблица, из нее выбирается часть строк по определенному признаку.
этот признак меняется в триггере, т.е.по мере работы юзера.
поэтому перед началом обработки в процедуре идет блокировка отобранных по этому признаку записей
(select for update), затем их обработка туда/сюда и в конце сброс признака в null.
вообще моя проблема в том и состоит, что я не очень понимаю, как правильно использовать блокировку по
select for update.
сейчас пихаю в курсор и потом построчно сбрасываю поле-признак
declare
  CURSOR cData IS
    select t.mark, t.apid, t.apname
    from table1 t 
    where t.mark=1
    for update;
  rData cData%ROWTYPE;
begin
  OPEN cData; 
  LOOP
    FETCH cData INTO rData; 
    EXIT WHEN cData%NOTFOUND; 
    
    /*тут обработка*/
    
    update table1
    set mark=null
    where apid=rData.apid;
    
  END LOOP;
  CLOSE cData;
end;    
sevasel
Дата: 13.10.2015 16:06:16
а хотелось бы

declare
  CURSOR cData IS
    select t.mark, t.apid, t.apname
    from table1 t 
    where t.mark=1
    for update;
  rData cData%ROWTYPE;
begin
  OPEN cData; 
  LOOP
    FETCH cData INTO rData; 
    EXIT WHEN cData%NOTFOUND; 
    
    /*тут обработка*/
    
  END LOOP;
 
  update table1
  set mark=null
  where t.mark=1;
 
  commit;

  CLOSE cData;
 
end;    
Dimitry Sibiryakov
Дата: 13.10.2015 16:08:25

sevasel
хотелось бы

Зачем? Разницы-то никакой.

Posted via ActualForum NNTP Server 1.5