Тупик при использовании SELECT FOR UPDATE

В соответствии с вашим запросом на титул, следующий скрипт создаст папку с именем после каждого *.png в каталоге, а затем переместит соответствующий файл во вновь созданный файл.

Пакет:

for %%i in (*.png) do (mkdir "%%~ni" && move %%i %%~ni)

Командная строка:

for %i in (*.png) do (mkdir "%~ni" && move %i %~ni)
0
задан Erwin Brandstetter 21 January 2019 в 02:01
поделиться

1 ответ

Ваши команды противоречат.

Если files.file_id определено UNIQUE (или PRIMARY KEY), вам не нужно LIMIT 1. И вам вообще не нужна явная блокировка. Просто запустите UPDATE, поскольку во всей транзакции затрагивается только одна строка, тупиковая ситуация невозможна. (Если нет побочных эффектов от триггеров или правил или задействованных функций.)

Если files.file_id не UNIQUE (как кажется), то UPDATE может влиять на несколько строк в произвольном порядке и только один из них заблокирован, рецепт для тупиков. Тогда более неотложная проблема заключается в том, что запрос не выполняет то, с чего вы, похоже, хотите начать.

Лучшее решение зависит от недостающей информации. Это будет работать:

UPDATE files
SET    ...
WHERE  primary_key_column = (
         SELECT primary_key_column
         FROM   files 
         WHERE  file_id = 123
         LIMIT  1
     --  FOR    UPDATE SKIP LOCKED
         );

Нет BEGIN; и COMMIT;, необходимых для одной команды, в то время как автоматическая фиксация по умолчанию включена.

Возможно, вы захотите добавить FOR UPDATE SKIP LOCKED (или FOR UPDATE NOWAIT) , чтобы пропустить или сообщить об ошибке, если строка уже заблокирована.

И вы, вероятно, захотите добавить предложение WHERE, которое позволит избежать повторной обработки одной и той же строки.

Подробнее здесь:

0
ответ дан Erwin Brandstetter 21 January 2019 в 02:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: