powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / update таблицы в oracle, как пропустить заблокированные строки?
11 сообщений из 11, страница 1 из 1
update таблицы в oracle, как пропустить заблокированные строки?
    #40008699
Anton_1234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть программа на delphi.
Нужно сделать update некоторого множества строк в таблице oracle.
Делаю это в цикле.
Если встречается заблокированная строка (кто-то другой с ней сейчас работает), то программа зависает и ждет пока строку освободят.
Хотелось бы как-то пропускать такие строки, встретилась такая строка, пропустили ее и пошли дальше по списку, можно потом сообщение какое-то пользователю выдать, типа: "такие-то строки обновить не удалось".
Админских прав у пользователя нет, т.е. запросы типа
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select
   c.owner,
   c.object_name,
   c.object_type,
   b.sid,
   b.serial#,
   b.status,
   b.osuser,
   b.machine
from
   v$locked_object a ,
   v$session b,
   dba_objects c
where
   b.sid = a.session_id
and
   a.object_id = c.object_id;


не пройдут (запрос здесь нашел https://stackoverflow.com/questions/2186848/how-to-find-locked-rows-in-oracle )
да еще пишут, что этот запрос работает очень медленно

вот и проблема: как пропустить заблокированные строки, не обрабатывать их?
...
Рейтинг: 0 / 0
update таблицы в oracle, как пропустить заблокированные строки?
    #40008713
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anton_1234, это плохо, что у вас записи блокируются надолго. Транзакция на изменение должна быть максимально быстрой. Вам необходимо пересмотреть работу с транзакциями в вашей программе.
...
Рейтинг: 0 / 0
update таблицы в oracle, как пропустить заблокированные строки?
    #40008715
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anton_1234
как пропустить заблокированные строки
можно глянуть в сторону select for update skip locked, но здесь неуместно
...
Рейтинг: 0 / 0
update таблицы в oracle, как пропустить заблокированные строки?
    #40008722
Anton_1234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
goldmi45
Anton_1234, это плохо, что у вас записи блокируются надолго. Транзакция на изменение должна быть максимально быстрой. Вам необходимо пересмотреть работу с транзакциями в вашей программе.
это не моя программа блокирует, какие-то другие программы используют эти же таблицы, в итоге у меня виснет, натыкается на заблокированную строку и ждет

если кто и пересматривать должен, то это не я

я работаю в сложившихся условиях, можно конечно всех отключить на некоторое время, чтобы проапдейтить, но это не очень удобно
было бы хорошо пропускать заблокированные строки, а в конце сообщение выдавать: обновилось, но не все, то-то и то-то не обновилось (список пропущенных)
...
Рейтинг: 0 / 0
update таблицы в oracle, как пропустить заблокированные строки?
    #40008725
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
update таблицы в oracle, как пропустить заблокированные строки?
    #40008807
Vlad074
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если у вас происходит в цикле UPDATE для каждой записи (по одной), то можно предварительно ее блокировать
с помощью 'SELECT FOR UPDATE NOWAIT', если запись заблокирована кем-то, то обрабатываете ошибку и переходите к следующей.

Не знаю насколько это оптимальный алгоритм, но выглядит рабочим.
...
Рейтинг: 0 / 0
update таблицы в oracle, как пропустить заблокированные строки?
    #40008818
Anton_1234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vlad074
Если у вас происходит в цикле UPDATE для каждой записи (по одной), то можно предварительно ее блокировать
с помощью 'SELECT FOR UPDATE NOWAIT', если запись заблокирована кем-то, то обрабатываете ошибку и переходите к следующей.

Не знаю насколько это оптимальный алгоритм, но выглядит рабочим.
спасибо.

попробую
...
Рейтинг: 0 / 0
update таблицы в oracle, как пропустить заблокированные строки?
    #40008825
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad074
обрабатываете ошибку
а можно просто 22214568 чтоб без ошибок и обработки
...
Рейтинг: 0 / 0
update таблицы в oracle, как пропустить заблокированные строки?
    #40008830
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anton_1234
Есть программа на delphi.
Нужно сделать update некоторого множества строк в таблице oracle.
Делаю это в цикле.

Задайте вопрос "как это правильно делать" и поступите в соответствии с грамотными ответами.

Anton_1234
вот и проблема: как пропустить заблокированные строки, не обрабатывать их?

Попробуйте взять на работу программиста, который умеет прочитать описание оператора SELECT в документации Oracle. Там раскрыт этот вопрос.

goldmi45
Транзакция на изменение должна быть максимально быстрой

Ну, это, допустим, неправда. Транзакция должна быть такой длительности, которая ей объективно нужна.
...
Рейтинг: 0 / 0
update таблицы в oracle, как пропустить заблокированные строки?
    #40008842
Anton_1234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vlad074
Если у вас происходит в цикле UPDATE для каждой записи (по одной), то можно предварительно ее блокировать
с помощью 'SELECT FOR UPDATE NOWAIT', если запись заблокирована кем-то, то обрабатываете ошибку и переходите к следующей.

Не знаю насколько это оптимальный алгоритм, но выглядит рабочим.
Спасибо.
Попробовал, ошибку выдает, а дальше я уже разберусь с ней.
...
Рейтинг: 0 / 0
update таблицы в oracle, как пропустить заблокированные строки?
    #40008871
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anton_1234,


Тестовая таблица
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TABLE test_update(ID integer PRIMARY KEY, Name varchar2(50));

INSERT INTO test_update(ID,Name) VALUES (1,'Line');
INSERT INTO test_update(ID,Name) VALUES (2,'Line');
INSERT INTO test_update(ID,Name) VALUES (3,'Line');
INSERT INTO test_update(ID,Name) VALUES (4,'Line');
INSERT INTO test_update(ID,Name) VALUES (5,'Line');
INSERT INTO test_update(ID,Name) VALUES (6,'Line');
commit;




Далее в одной сессии блокируем стоку с ID=3
Важно: никаких COMMIT пока не делать
Код: plsql
1.
UPDATE test_update SET Name = 'Lock line 3' WHERE ID=3;



Потом в другой сессии обновляем незаблокированные строки
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
begin
   FOR recUpd IN
   (
      SELECT u.ID
      FROM test_update u
      FOR UPDATE SKIP LOCKED
   )
   LOOP
      UPDATE test_update 
      SET test_update.name = 'Updated'
      WHERE test_update.ID = recUpd.ID;
   END LOOP;

   COMMIT;
end;



после коммита всех сессий получаем:

Код: plsql
1.
select * from test_update


IDNAME1Updated2Updated3 Lock line 3 4Updated5Updated6Updated
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / update таблицы в oracle, как пропустить заблокированные строки?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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