Противники FOR Update в курсоре

Edgar
Дата: 11.06.2006 15:46:10
Уважаемые,

Кто то может привести веский довод в пользу того, что FOR UPDATE использовать не рекомендуется, если это возможно.
Таблица имеет уникальный ключ, и вполне можно избежать использования FOR UPDATE (CURRENT OF) в цикле.
Почему FOR UPDATE не стоит использовать, кроме как из за того, что он блокирует таблицу? Может ли это повлиять на производительность?

Спасибо,
dmidek
Дата: 11.06.2006 16:11:05
Читаем в доку

Oracle 9i PL/SQL User's Guide and Reference
Release 2 (9.2)
Using FOR UPDATE

The SELECT ... FOR UPDATE statement identifies the rows that will be updated or deleted, then locks each row in the result set. This is useful when you want to base an update on the existing values in a row. In that case, you must make sure the row is not changed by another user before the update.


Если для Вас это важно, используйте FOR UPDATE. Если нет, то зачем он ?
Edgar
Дата: 11.06.2006 16:27:06
Как раз я должен поставщику доказать, что использование FOR UPDATE не целесообразно...
Помогите выиграть спор!
andrey_anonymous
Дата: 11.06.2006 16:35:37
Edgar
Как раз я должен поставщику доказать, что использование FOR UPDATE не целесообразно...
Помогите выиграть спор!

Спор ради спора - занятие бесцельное.
Однако из изложенного следует, что поставщик (если имеется ввиду поставщик ПО) использует for update. Скорее всего, он это делает к месту.
Ваше же представление о целесообразности не основано ни на чем.
ИМХО Вы не сможете выиграть спор.
grexhide
Дата: 11.06.2006 16:36:36
Edgar
Как раз я должен поставщику доказать, что использование FOR UPDATE не целесообразно...
Помогите выиграть спор!


Проблема в том, что в данном случе как раз - и целесообразно.

Другой вопрос - что не целеообразно в цикле делать серию FOR UPDATE, когда можно - всего один.

--

P.S. А вообще - от задачи зависит.
dmidek
Дата: 11.06.2006 16:54:06
Представим себе , что у Вас есть код (схема)

cursor cur_emp
is select * from scott.emp where sal > 10
for update ; -- ?

begin
open cur_emp;
FOR I in cur_emp
LOOP
UPDATE scott.emp
set sal = 0 where  empno = cur_emp.empno ;
END LOOP;
END;

Нужен или не нужен в этом коде FOR UPDATE ?
Никто Вам не ответит, не зная Вашу проблемную область.
Если существует опасность изменения данных в ходе выполнения цикла, то конечно необходимо использовать FOR UPDATE + (замечу в скобках WHERE CURRENT OF).
Если такой опасности нет, то он не нужен.

Но вообще то (c) " Крылья ? Ноги ? Хвосты !"
Данный пример естественно надо решать

UPDATE scott.emp
set sal = 0 
where sal > 10

Отдаю себе отчет, что это не универсальное решение,
но ареал его применения ИМХО очень широк.
Посмотрите в его сторону.
Селектор
Дата: 11.06.2006 17:10:15
Edgar
Уважаемые,

Кто то может привести веский довод в пользу того, что FOR UPDATE использовать не рекомендуется, если это возможно.
Таблица имеет уникальный ключ, и вполне можно избежать использования FOR UPDATE (CURRENT OF) в цикле.
Почему FOR UPDATE не стоит использовать, кроме как из за того, что он блокирует таблицу? Может ли это повлиять на производительность?

Спасибо,
Он всегда негативно влияет на производительность. Но иногда даже с этой точки зрения следует применять. Смотри почту.
Упдатер
Дата: 11.06.2006 17:13:36
dmidek
Нужен или не нужен в этом коде FOR UPDATE ?
Никто Вам не ответит, не зная Вашу проблемную область.
Это правильно

dmidek
Если такой опасности нет, то он не нужен.
А это - нет.
dmidek
Дата: 11.06.2006 17:20:24
Упдатер

dmidek
Если такой опасности нет, то он не нужен.
А это - нет.

Можно с этого места поподробнее ?
grexhide
Дата: 11.06.2006 17:28:14
dmidek

Можно с этого места поподробнее ?


а) очевидность или неочевидность "опасности" - часто не видна.

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

Дидлоки, понимаете, это не самое худшее из зол. Худшее - это неуправляемая связность и потеря логической целостности, размазанная по зависимостям сущностей, множеству процедур и криворукости-верхоглядству разработчиков в процессе доработки системы....