powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / select for update
25 сообщений из 27, страница 1 из 2
select for update
    #39476777
Tester666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток!
Нашел тут в старом коде такую конструкцию:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
--кусок из процедуры пакета:
SELECT ID INTO EMP
  FROM MYTABLE
 WHERE ID = RINID
FOR UPDATE;
--тут же следом идем апдейт
UPDATE MYTABLE d
SET FIELD1          = NVL(NEWFIELD1, FIELD1),
    FIELD2          = NVL(NEWFIELD2, FIELD2)
WHERE ID = RINID;



Запрос select вернет 1 запись, переменная EMP нигде не используется. Имеет ли смысл использовать для этого конструкцию select for update? Не проще ли оставить просто один update?
...
Рейтинг: 0 / 0
select for update
    #39476791
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кривенько конечно.

Потенциальная проблема:
Из кода не очевидно, что между select for update и update в таблице не может появится вторая запись с указанным ID.
При наличии PK/UK - не актуально.
Но все-таки если используется select for update - то логично делать update where current of

Совсем убрать select for update можно только в процессе рефакторинга, воспроизведя или скорректировав реакцию кода на too_many_rows и no_data_found
...
Рейтинг: 0 / 0
select for update
    #39476793
no data found
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
1.
2.
3.
4.
5.
case sql%rowcount
    when 0 then raise no_data_found
    when 1 then null
    else raise too_many_rows
end case
...
Рейтинг: 0 / 0
select for update
    #39476826
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no data found
Код: plsql
1.
2.
3.
4.
5.
case sql%rowcount
    when 0 then raise no_data_found
    when 1 then null
    else raise too_many_rows
end case




в случае когда id не уникально етого мало, ибо три записи уже будут изменены

.....
stax
...
Рейтинг: 0 / 0
select for update
    #39477424
Tester666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поле ID является первичным ключем, так что запись может быть только одна.
...
Рейтинг: 0 / 0
select for update
    #39477492
no data found
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Tester666Поле ID является первичным ключем, так что запись может быть только одна.
либо 0, что в случае select for update инициирует no data found
...
Рейтинг: 0 / 0
select for update
    #39477536
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tester666Поле ID является первичным ключем, так что запись может быть только одна.
подозреваю что в селекте изначально была кляюза wait/nowait,
которой к сожленью нет в чистом update

.....
stax
...
Рейтинг: 0 / 0
select for update
    #39477558
Tester666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stax..,

нет, этот кусок кода дошел до наших дней без изменений.
...
Рейтинг: 0 / 0
select for update
    #39477611
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tester666stax..,

нет, этот кусок кода дошел до наших дней без изменений.

авторНашел тут в старом коде такую конструкцию:


ето понятно что он счас такой, а каким он был изначально, хз

я такую последовательность пользовал в двух случаях

1) order by для многострочного update (не подходіт із-за ПК)
2) wait/nowait


.....
stax
...
Рейтинг: 0 / 0
select for update
    #39477620
georgy_g
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В данном случае можно удалить. Но если тут бы был wait/nowait, то удалять не стоит.
...
Рейтинг: 0 / 0
select for update
    #39477675
Tester666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мы историю изменений храним в свн. Видно, что изначально так было. Может во время написания до выкладки в свн что-то другое конечно было...но судя по тому, что у нас таких похожих моментов несколько найдено, налицо просто непонимание работы select for update.
Спасибо всем, буду убирать.
...
Рейтинг: 0 / 0
select for update
    #39477680
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
georgy_gВ данном случае можно удалить.
Низзя.
Случится сокрытие no_data_found.
...
Рейтинг: 0 / 0
select for update
    #39477707
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tester666налицо просто непонимание работы select for update.
Или ты не понимаешь, что хотел сделать программист.
Может это у него заготовка на случай развития для пессимистической блокировки. Или на тот же wait/nowait.
В текущем виде, конечно, бесполезно.
...
Рейтинг: 0 / 0
select for update
    #39477715
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousСлучится сокрытие no_data_found.
Ну раз человек уберет, то и в принимающей стороне подкрутит. Может ему вообще не важно.
...
Рейтинг: 0 / 0
select for update
    #39477726
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньевandrey_anonymousСлучится сокрытие no_data_found.
Ну раз человек уберет, то и в принимающей стороне подкрутит. Может ему вообще не важно.
Судя по постановке вопроса - не факт, что подкрутит.
Скорее просто "оптимизирует".
А проблема всплывет через много-много дней, когда данные могу быть уже сильно испохаблены.
...
Рейтинг: 0 / 0
select for update
    #39477925
д0kХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymousКривенько конечно.

Потенциальная проблема:
Из кода не очевидно, что между select for update и update в таблице не может появится вторая запись с указанным ID.
При наличии PK/UK - не актуально.
Но все-таки если используется select for update - то логично делать update where current of

Совсем убрать select for update можно только в процессе рефакторинга, воспроизведя или скорректировав реакцию кода на too_many_rows и no_data_found

Я бы ужесточил формулировку

update where current of обязательно нужно делать




а то можно пролететь мимо ORA-01002
а FOR UPDATE объявляется для того что бы мимо не нее не пролететь.
...
Рейтинг: 0 / 0
select for update
    #39478176
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
д0kХ
Я бы ужесточил формулировку

да, да, да

особенно с учетом того что если where сильно не детерминировано то for update
может
1) вернуть не заблокированные записи
2) заблокировать записи, которых нет в результируещем наборе


.....
stax
...
Рейтинг: 0 / 0
select for update
    #39478232
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..особенно с учетом того что если where сильно не детерминировано то for update
может
1) вернуть не заблокированные записи
Ммм?
...
Рейтинг: 0 / 0
select for update
    #39478299
yes_data_found
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почему на форуме я вижу обсуждения только select for update? Почему нет for insert, for delete, for merge, for select в конце концов?
...
Рейтинг: 0 / 0
select for update
    #39478323
kernA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yes_data_foundПочему на форуме я вижу обсуждения только select for update? Почему нет for insert, for delete, for merge, for select в конце концов?

Может из за того, что Oracle до этого не додумался ?)
...
Рейтинг: 0 / 0
select for update
    #39478326
концепты
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
yes_data_foundПочему на форуме я вижу обсуждения только select for update? Почему нет for insert, for delete, for merge, for select в конце концов?

Потому что в концептах этого нет и не может быть ввиду архитектурных особенностей .
...
Рейтинг: 0 / 0
select for update
    #39478444
yes_data_found
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
yes_data_foundПочему на форуме я вижу обсуждения только select for update? Почему нет for insert, for delete, for merge, for select в конце концов?
И это я только dml перечислил. А есть ведь еще ddl.
...
Рейтинг: 0 / 0
select for update
    #39478532
д0kХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymousstax..особенно с учетом того что если where сильно не детерминировано то for update
может
1) вернуть не заблокированные записи
Ммм?


В данном, конкретном случае наверное нет , а в принципе , если
НЕ использовать where current of и в цикл обработки курсора
втавить commit , то аж на расс ....

докаRow Locks (TX)
A row lock, also called a TX lock, is a lock on a single row of a table. A transaction acquires a row lock for each row modified by one of the following statements: INSERT, UPDATE, DELETE, MERGE, and SELECT ... FOR UPDATE. The row lock exists until the transaction commits or rolls back.
...
Рейтинг: 0 / 0
select for update
    #39478561
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
д0kХв цикл обработки курсора втавить commit
Есть еще тысяча-и-один способ "выстрелить себе в ногу".
...
Рейтинг: 0 / 0
select for update
    #39478604
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

select for update

.....
stax
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / select for update
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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