Извлечь одну строку, которая не заблокирована в Oracle

У меня есть большой набор данных в Oracle, который мне нужен для обработки некоторых строк со столбцом PROCESSED= 0.

У меня есть несколько экземпляров приложения, которое будет читать по одной строке за раз и выполнять обработку. Чтобы избежать доступа нескольких потоков к одной и той же строке, я использую

SELECT * FROM FOO WHERE ROWNUM = 1 FOR UPDATE

Если я выполню приведенный выше запрос, первый поток заблокирует строку, а другие строки не смогут получить какие-либо строки, поскольку ROWUM = 1 уже заблокирован первым потоком. Чего я пытаюсь добиться, так это получить следующую разблокированную строку.

Есть ли эффективный способ сделать это через SQL?


person Mustafa G    schedule 18.08.2020    source источник
comment
stackoverflow.com/questions/30993756/ Помогает ли это?   -  person Namandeep_Kaur    schedule 18.08.2020
comment
Rownum не будет работать, потому что он произвольный — значения присваиваются при выполнении запроса и применяются только к набору результатов, а не к порядку строк в самой таблице.   -  person pmdba    schedule 19.08.2020


Ответы (1)


Похоже, SKIP LOCKED — это то, что вы ищете. См. документацию.

select * from foo for update skip locked

выберет только те строки, которые не заблокированы другими транзакциями

person Dornaut    schedule 19.08.2020