|
|
|
update таблицы в oracle, как пропустить заблокированные строки?
|
|||
|---|---|---|---|
|
#18+
Есть программа на delphi. Нужно сделать update некоторого множества строк в таблице oracle. Делаю это в цикле. Если встречается заблокированная строка (кто-то другой с ней сейчас работает), то программа зависает и ждет пока строку освободят. Хотелось бы как-то пропускать такие строки, встретилась такая строка, пропустили ее и пошли дальше по списку, можно потом сообщение какое-то пользователю выдать, типа: "такие-то строки обновить не удалось". Админских прав у пользователя нет, т.е. запросы типа Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. не пройдут (запрос здесь нашел https://stackoverflow.com/questions/2186848/how-to-find-locked-rows-in-oracle ) да еще пишут, что этот запрос работает очень медленно вот и проблема: как пропустить заблокированные строки, не обрабатывать их? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2020, 08:18 |
|
||
|
update таблицы в oracle, как пропустить заблокированные строки?
|
|||
|---|---|---|---|
|
#18+
Anton_1234, это плохо, что у вас записи блокируются надолго. Транзакция на изменение должна быть максимально быстрой. Вам необходимо пересмотреть работу с транзакциями в вашей программе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2020, 09:02 |
|
||
|
update таблицы в oracle, как пропустить заблокированные строки?
|
|||
|---|---|---|---|
|
#18+
Anton_1234 как пропустить заблокированные строки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2020, 09:08 |
|
||
|
update таблицы в oracle, как пропустить заблокированные строки?
|
|||
|---|---|---|---|
|
#18+
goldmi45 Anton_1234, это плохо, что у вас записи блокируются надолго. Транзакция на изменение должна быть максимально быстрой. Вам необходимо пересмотреть работу с транзакциями в вашей программе. если кто и пересматривать должен, то это не я я работаю в сложившихся условиях, можно конечно всех отключить на некоторое время, чтобы проапдейтить, но это не очень удобно было бы хорошо пропускать заблокированные строки, а в конце сообщение выдавать: обновилось, но не все, то-то и то-то не обновилось (список пропущенных) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2020, 09:31 |
|
||
|
update таблицы в oracle, как пропустить заблокированные строки?
|
|||
|---|---|---|---|
|
#18+
Anton_1234, ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2020, 09:39 |
|
||
|
update таблицы в oracle, как пропустить заблокированные строки?
|
|||
|---|---|---|---|
|
#18+
Если у вас происходит в цикле UPDATE для каждой записи (по одной), то можно предварительно ее блокировать с помощью 'SELECT FOR UPDATE NOWAIT', если запись заблокирована кем-то, то обрабатываете ошибку и переходите к следующей. Не знаю насколько это оптимальный алгоритм, но выглядит рабочим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2020, 12:13 |
|
||
|
update таблицы в oracle, как пропустить заблокированные строки?
|
|||
|---|---|---|---|
|
#18+
Vlad074 Если у вас происходит в цикле UPDATE для каждой записи (по одной), то можно предварительно ее блокировать с помощью 'SELECT FOR UPDATE NOWAIT', если запись заблокирована кем-то, то обрабатываете ошибку и переходите к следующей. Не знаю насколько это оптимальный алгоритм, но выглядит рабочим. попробую ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2020, 12:19 |
|
||
|
update таблицы в oracle, как пропустить заблокированные строки?
|
|||
|---|---|---|---|
|
#18+
Vlad074 обрабатываете ошибку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2020, 12:23 |
|
||
|
update таблицы в oracle, как пропустить заблокированные строки?
|
|||
|---|---|---|---|
|
#18+
Anton_1234 Есть программа на delphi. Нужно сделать update некоторого множества строк в таблице oracle. Делаю это в цикле. Задайте вопрос "как это правильно делать" и поступите в соответствии с грамотными ответами. Anton_1234 вот и проблема: как пропустить заблокированные строки, не обрабатывать их? Попробуйте взять на работу программиста, который умеет прочитать описание оператора SELECT в документации Oracle. Там раскрыт этот вопрос. goldmi45 Транзакция на изменение должна быть максимально быстрой Ну, это, допустим, неправда. Транзакция должна быть такой длительности, которая ей объективно нужна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2020, 12:30 |
|
||
|
update таблицы в oracle, как пропустить заблокированные строки?
|
|||
|---|---|---|---|
|
#18+
Vlad074 Если у вас происходит в цикле UPDATE для каждой записи (по одной), то можно предварительно ее блокировать с помощью 'SELECT FOR UPDATE NOWAIT', если запись заблокирована кем-то, то обрабатываете ошибку и переходите к следующей. Не знаю насколько это оптимальный алгоритм, но выглядит рабочим. Попробовал, ошибку выдает, а дальше я уже разберусь с ней. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2020, 12:54 |
|
||
|
update таблицы в oracle, как пропустить заблокированные строки?
|
|||
|---|---|---|---|
|
#18+
Anton_1234, Тестовая таблица Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. Далее в одной сессии блокируем стоку с ID=3 Важно: никаких COMMIT пока не делать Код: plsql 1. Потом в другой сессии обновляем незаблокированные строки Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. после коммита всех сессий получаем: Код: plsql 1. IDNAME1Updated2Updated3 Lock line 3 4Updated5Updated6Updated ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2020, 13:32 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=40008842&tid=2037928]: |
0ms |
get settings: |
5ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
150ms |
get topic data: |
6ms |
get forum data: |
3ms |
get page messages: |
29ms |
get tp. blocked users: |
1ms |
| others: | 199ms |
| total: | 405ms |

| 0 / 0 |
