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

http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96524/c21cnsis.htm#2799
...
Рейтинг: 0 / 0
помогите разобраться с ForUpdate
    #32122862
ora600
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
обратите внимание на уровень изоляции serializable - это наверное то что Вы ищете
...
Рейтинг: 0 / 0
помогите разобраться с ForUpdate
    #32122932
Begemot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ясно) спасибо все кто откликнулся))а встречный вопрос по 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
помогите разобраться с ForUpdate
    #32122939
Begemot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я забыл fetch добавить...но уже поздно....но смысл от этого не меняется-я имею ввиду алгоритм
...
Рейтинг: 0 / 0
помогите разобраться с ForUpdate
    #32123087
Begemot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
АУ...Господа знатоки!Так что правильно я мыслю или нет? Этот код заблокирует для измененний перву неизменненну строку и выйдет..а если было за 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
помогите разобраться с ForUpdate
    #32123199
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первая сессия:

Код: 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
9 сообщений из 9, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / помогите разобраться с ForUpdate
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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