Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 select for update (не понятное поведение)  [new]
vlad_nal
Member

Откуда: Новосибирск
Сообщений: 60
Здравствуйте !
Столкнулся с таким не совсем для меня понятным явлением (Oracle 11.2.0.1):
есть не явный курсор:

FOR cur_wm IN (SELECT m.ID
FROM w_m m
FOR UPDATE)
LOOP
UPDATE w_m .......
....................
END LOOP;

Так вот. Непонятность заключается в том, что иногда это цикл не выполняется вообще, хотя данные есть !
То есть, такое впечатление, что SELECT FOR UPDATE - просто не может получить блокировку, и "проглатывает" весь курсор, НЕ ГЕНЕРЯ никакого эксепшена !
Вопрос: посвятите кто нибудь, что происходит если SELECT FOR UPDATE - ожидает (во первых сколько он может ждать ? это каким параметром регулируется ?), и в итоге не получает блокировку ?
Как можно заставить Oracle генерить исключение в случае если блокировка так и не получена ?

Не хочется ставить FOR UPDATE NOWAIT, для того чтоб не получать отказы в работе пользователей.
Но и "глотания" курсора хочется избежать. Чтоб если уж не дождался тогда возникал эксепшен.
24 окт 12, 08:30    [13366248]     Ответить | Цитировать Сообщить модератору
 Слышал звон, потому что мудозвон  [new]
-2-
Member

Откуда:
Сообщений: 15330
vlad_nal,

что препятствует получению впечатлений от просмотра синтаксических картинок по селекту?
24 окт 12, 09:04    [13366375]     Ответить | Цитировать Сообщить модератору
 Re: select for update (не понятное поведение)  [new]
ten
Member

Откуда: Екатеринбург
Сообщений: 1672
vlad_nal
что происходит если SELECT FOR UPDATE - ожидает

vlad_nal
Как можно заставить Oracle генерить исключение в случае если блокировка так и не получена ?

select for update NOWAIT | WAIT:
24 окт 12, 09:12    [13366396]     Ответить | Цитировать Сообщить модератору
 Re: select for update (не понятное поведение)  [new]
Многоопытный
Guest
vlad_nal
такое впечатление
Недостаток опыта и практики нередко компенсируется излишней впечатлительностью.
Но с годами начнёшь подозревать в первую очередь себя и лишь в последнюю - Oracle, и то только под давлением неопровержимых фактов.
24 окт 12, 09:17    [13366417]     Ответить | Цитировать Сообщить модератору
 Re: select for update (не понятное поведение)  [new]
vlad_nal
Member

Откуда: Новосибирск
Сообщений: 60
ten,

Читал.
предлагается поставить "to wait integer seconds " ?
что будет поле истечения этих секунд ? Oracle сгенерит эксепшен ?
24 окт 12, 09:48    [13366596]     Ответить | Цитировать Сообщить модератору
 Re: select for update (не понятное поведение)  [new]
vlad_nal
Member

Откуда: Новосибирск
Сообщений: 60
-2-,
мне это не нужно, у меня "все шаги записаны" в трейс
и я вижу по трейсу , что выполнение внутри loop не происходит !
Но повторяю , не всегда !
Запускаю ту же процедуру "ручками", все нормально отрабатывает
24 окт 12, 09:50    [13366612]     Ответить | Цитировать Сообщить модератору
 Re: select for update (не понятное поведение)  [new]
vlad_nal
Member

Откуда: Новосибирск
Сообщений: 60
Многоопытный,

спасибо за бесценные мысли !
24 окт 12, 09:52    [13366622]     Ответить | Цитировать Сообщить модератору
 Re: select for update (не понятное поведение)  [new]
ten
Member

Откуда: Екатеринбург
Сообщений: 1672
vlad_nal
Читал.
предлагается поставить "to wait integer seconds " ?

Нет. Это просто ссылка на документацию, где все сказано прямым текстом. Если что-то непонятно, то следует еще раз прочитать. Предлагать что-либо нет смысла, так как неизвестно, что и как должна делать программа.
vlad_nal
и я вижу по трейсу , что выполнение внутри loop не происходит !
Но повторяю , не всегда !

Значит ищите в чем отличие ручного запуска от обычного выполнения, почему запрос ничего не возвращает.
24 окт 12, 10:07    [13366751]     Ответить | Цитировать Сообщить модератору
 Re: select for update (не понятное поведение)  [new]
ten
Member

Откуда: Екатеринбург
Сообщений: 1672
vlad_nal
что будет поле истечения этих секунд ? Oracle сгенерит эксепшен ?

Проверить быстрее чем написать вопрос на форум
24 окт 12, 10:09    [13366762]     Ответить | Цитировать Сообщить модератору
 Re: select for update (не понятное поведение)  [new]
vlad_nal
Member

Откуда: Новосибирск
Сообщений: 60
ten,

скажите пожалуйста, что я не увидел в документации ? но из нее мне не понятно, что будет если select for update так и не получит блокировки ?

приложение должно списывать остаток товара из таблицы.
for update поставлено для того, чтоб несколько пользователей не списали остатка больше чем есть.
for update nowait не могу поставить, потому, что в этом случае при обращении нескольких пользователей - первый отработает, а все остальные отвалятся по эксепшену, что не правильно, ведь остатка может на всех хватать.
24 окт 12, 10:29    [13366910]     Ответить | Цитировать Сообщить модератору
 Re: select for update (не понятное поведение)  [new]
vlad_nal
Member

Откуда: Новосибирск
Сообщений: 60
ten,

извиняюсь был не прав
эксепшен возникает, по крайней мере есть ставить явное: wait 10
24 окт 12, 10:36    [13366958]     Ответить | Цитировать Сообщить модератору
 Re: select for update (не понятное поведение)  [new]
ten
Member

Откуда: Екатеринбург
Сообщений: 1672
vlad_nal
мне не понятно, что будет если select for update так и не получит блокировки ?

If you specify neither WAIT nor NOWAIT, then the database waits until the row is available and then returns the results of the SELECT statement.

Т.е. запрос рано или поздно получит свою блокировку - будет просто ждать до последнего, ну кроме, естественно всяких случаев взаимоблокировок.
24 окт 12, 11:04    [13367125]     Ответить | Цитировать Сообщить модератору
 Re: select for update (не понятное поведение)  [new]
ten
Member

Откуда: Екатеринбург
Сообщений: 1672
vlad_nal
приложение должно списывать остаток товара из таблицы.
for update поставлено для того, чтоб несколько пользователей не списали остатка больше чем есть.

Первое, что приходит в голову - поменять принцип на оптимистическое блокирование
24 окт 12, 11:08    [13367162]     Ответить | Цитировать Сообщить модератору
 Re: select for update (не понятное поведение)  [new]
vlad_nal
Member

Откуда: Новосибирск
Сообщений: 60
ten,

принцип "оптимистических блокировок" - здесь абсолютно не подходит.
так как, мне нужно разрешить изменение строки несколькими пользователями , но сделать это так как будто они делают это последовательно.

select fror update wait n - мне подходит идеально.
24 окт 12, 12:18    [13367700]     Ответить | Цитировать Сообщить модератору
 Re: select for update (не понятное поведение)  [new]
stax..
Guest
vlad_nal
ten,

принцип "оптимистических блокировок" - здесь абсолютно не подходит.
так как, мне нужно разрешить изменение строки несколькими пользователями , но сделать это так как будто они делают это последовательно.

select fror update wait n - мне подходит идеально.

добавте order by, иначе рано или поздно получите деадлок

......
stax
24 окт 12, 14:35    [13368791]     Ответить | Цитировать Сообщить модератору
 Re: select for update (не понятное поведение)  [new]
спилберг
Guest
vlad_nal
ten,

select fror update wait n - мне подходит идеально.

select for update         = select for update wait 999999999999+1
select for update nowait  = select for update wait 0
select for update wait 10 = select for update wait 10


Как это соотносится с тем что курсор вообще не возвращал "иногда" строк - "ни понятноооо" (c)Ф.Ю.Спилберг
24 окт 12, 14:44    [13368855]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить