Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / помогите разобраться с ForUpdate / 9 сообщений из 9, страница 1 из 1
19.03.2003, 11:54
    #32122747
Begemot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите разобраться с ForUpdate
представьте себе такую ситуацию
один пользователь делает запрос типа
Код: plaintext
Select... where ..< 3  for Update nowait
. Результатом будет выборка из таблицы, которая будет защищена от изменения другим пользователем....А этот блок будет распространяться на все записи или только те,, котороые попали в условие? и что будет если другой пользователь будет делать Uddate по всем записям- провалиться весь запрос или он обновит только то что сможет.Заранее спасибо за ответ
...
Рейтинг: 0 / 0
19.03.2003, 12:03
    #32122766
ora600
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите разобраться с ForUpdate
1) на те которые в условии
2) весь . если бы не было nowait , то второй будет ждать пока не закоммитится-зароллбэчиться первый
...
Рейтинг: 0 / 0
19.03.2003, 12:19
    #32122793
Begemot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите разобраться с ForUpdate
а если мне надо изменит только не блокированные записи? как тогда поступить
...
Рейтинг: 0 / 0
19.03.2003, 12:50
    #32122839
ora600
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите разобраться с ForUpdate
открыть курсор и в цикле апдейтить и коммитить. или как Denis Popov советовал - ... for update skip locked . Моё мнение - недокументированной возможностью не пользоваться и пересмотреть транзакционную модель приложения - ведь это мягко говоря странно - чуваки наперегонки что-то апдейтят по одинаковому условию. Причем если действительно создать ЭТО то нельзя быть до конца уверенным что проапдейчено ВСЕ что нужно.

http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96524/c21cnsis.htm#2799
...
Рейтинг: 0 / 0
19.03.2003, 13:09
    #32122862
ora600
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите разобраться с ForUpdate
обратите внимание на уровень изоляции serializable - это наверное то что Вы ищете
...
Рейтинг: 0 / 0
19.03.2003, 14:07
    #32122932
Begemot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите разобраться с ForUpdate
Ясно) спасибо все кто откликнулся))а встречный вопрос по Pl SQl. Я понимаю что возможно ламерский вопрос,но охото до конца разобраться

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Declare
    Busy exception;
    Pragma Exception_Init(Busy, - 54 );
    Cursor c1 is select rowid as r from t1; 

begin
    Open c1;
    Loop;
        select  ... ,rowid,... from t1 where rowid=c1.r for update nowait
        ...
            /*
           обработка
            */ 
        ...
       exit;
       Exception when Busy then null
    End Loop
Эта программа обработает 1 незалоченную строку.....Несмотря на количесво ззалоченных - я прав? или как-то по другому надо?я учусь-поэтому если это глупость -сильно не смейтесь
end;
/
...
Рейтинг: 0 / 0
19.03.2003, 14:13
    #32122939
Begemot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите разобраться с ForUpdate
я забыл fetch добавить...но уже поздно....но смысл от этого не меняется-я имею ввиду алгоритм
...
Рейтинг: 0 / 0
19.03.2003, 16:28
    #32123087
Begemot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите разобраться с ForUpdate
АУ...Господа знатоки!Так что правильно я мыслю или нет? Этот код заблокирует для измененний перву неизменненну строку и выйдет..а если было за lock-ная строка то пропустит и пойдет дальше поциклу...Я просто проверить не могу....Ответьте пожалуйсту
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Declare
    Busy exception;
    Pragma Exception_Init(Busy, - 54 );
    Cursor c1 is select rowid as r from t1; 
    с2 с1%RowType

begin
    Open c1;
    Loop;
       Fetch c1 into c2;
        select  ... ,rowid,... from t1 where rowid=c1.r for update nowait
        ...
            /*
           обработка
            */ 
        ...
       exit;
       Exception when Busy then null
    End Loop
...
Рейтинг: 0 / 0
19.03.2003, 18:25
    #32123199
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите разобраться с ForUpdate
Первая сессия:

Код: plaintext
1.
select * from scott.emp where mod(empno,  2 ) =  0  for update nowait;


Вторая сессия:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
declare
    busy exception;
    pragma exception_init(busy, - 54 );
    cursor cr_emp is
      select empno from scott.emp;
    v_empno scott.emp.empno%type;
    v_row scott.emp%rowtype;
begin
    open cr_emp;
    loop
      begin
        fetch cr_emp into v_empno;
        exit when cr_emp%notfound;
        select e.*
        into v_row
        from scott.emp e
        where empno = v_empno
        for update nowait;
        dbms_output.put_line('locked empno='||v_empno||';');
      exception
        when busy then
          dbms_output.put_line('skipped empno='||v_empno||';');
     end;
   end loop;
   close cr_emp;
exception when others then
  if cr_emp%isopen then close cr_emp; end if;
  raise;
end;
/
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / помогите разобраться с ForUpdate / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]