Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> select ... for UPDATE, В ХП 
:(
    Опции темы
Plamenk
Дата 9.11.2005, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 258
Регистрация: 18.2.2003

Репутация: нет
Всего: 3



Все привет!

Предположим у меня есть ХП, которая проверяет наличие записи по 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?
И если да, то как этого избежать?

Заранее Все Большое Спасибо!

Это сообщение отредактировал(а) Plamenk - 9.11.2005, 14:27
PM MAIL   Вверх
Paradox
Дата 9.11.2005, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1135
Регистрация: 18.11.2002
Где: Россия

Репутация: 3
Всего: 1



а откуда m_id ???
опять же есть у тебя уникальный ключ на ID или нет ?
описал бы поподробнее



--------------------
---
PM MAIL WWW   Вверх
LSD
Дата 9.11.2005, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



Цитата(Plamenk @ 9.11.2005, 14:26)
Возможна ли ситуация, при которой будут добавлены несколько записей с одинаковым ID?

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

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

А еще лучше отказаться от такого принципа генерации ключей и использовать sequence.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Plamenk
Дата 9.11.2005, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 258
Регистрация: 18.2.2003

Репутация: нет
Всего: 3



А можно по подробнее про DBMS_LOCK.
PM MAIL   Вверх
LSD
Дата 9.11.2005, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



Да там вообщем ничего особенного:
Код
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;
/



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Plamenk
Дата 9.11.2005, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 258
Регистрация: 18.2.2003

Репутация: нет
Всего: 3



Спасибо, LSD!

Я вроде разобрался!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.0588 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.