select ... for UPDATE

 
0
 
Oracle
ava
Plamenk | 09.11.2005, 14:26
Все привет!

Предположим у меня есть ХП, которая проверяет наличие записи по ID и если такой записи нет добавляет её:


select count(*) into m_count from test t where t.id = m_id;
if (m_count=0) then
  insert into test (...) values ();
end if;


Вопрос собственно в следующем, что будет происходить при одновременном вызове данной ХП несколькими пользователями?

Возможна ли ситуация, при которой будут добавлены несколько записей с одинаковым ID?
И если да, то как этого избежать?

Заранее Все Большое Спасибо!
Comments (5)
ava
Paradox | 09.11.2005, 14:50 #
а откуда m_id ???
опять же есть у тебя уникальный ключ на ID или нет ?
описал бы поподробнее
ava
LSD | 09.11.2005, 14:53 #
Цитата (Plamenk @ 9.11.2005, 14:26)
Возможна ли ситуация, при которой будут добавлены несколько записей с одинаковым ID?

Если на столбец ID стоит ограничение unique, то 2 одинаковых записи ты не получишь никогда, будут просто ошибки нарушение уникальности. Если нет то такая ситуация возможна.

Решить эту проблему можно захватывая блокировку на некий общий ресурс. Можно конечно и саму таблицу select for update, но это нежелательно лучше использовать DBMS_LOCK.

А еще лучше отказаться от такого принципа генерации ключей и использовать sequence.
ava
Plamenk | 09.11.2005, 15:19 #
А можно по подробнее про DBMS_LOCK.
ava
LSD | 09.11.2005, 15:44 #
Да там вообщем ничего особенного:
declare
i integer;
begin
i := dbms_lock.request('my_table_lock', dbms_lock.x_mode, dbms_lock.maxwait);
-- Если 0 то мы успешно захватили блокировку
dbms_output.put_line(to_char(i));
i := dbms_lock.release('my_table_lock');
dbms_output.put_line(to_char(i));
end;
/
ava
Plamenk | 09.11.2005, 17:01 #
Спасибо, LSD!

Я вроде разобрался!
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
  Paradox   Plamenk ava  LSD
advanced
Submit