Деблокировка возникает, когда транзакция A блокирует запись, затем должна ждать транзакции B, чтобы разблокировать запись, в то время как транзакция B ожидает записи, уже заблокированной транзакцией A.
Oracle имеет довольно сложный механизм для обработки изменений в таблицах в ходе обновления. См
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:11504247549852
Как правило, риск взаимоблокировки увеличивается, чем дольше выполняется транзакция и тем больше данных изменяется транзакция. Я бы сказал, что это вряд ли приведет к взаимоблокировке, но, скорее всего, приведет к «очереди» - если у вас есть три или четыре одновременных сеанса, выполняющих этот SQL, каждый сеанс будет иметь одинаковый путь выполнения для SQL, будет идентифицировать одинаковые строки для обновления, один доберется до них первым, остальные подождут. Когда первая транзакция завершится, другая перехватит записи, обнаружит, что они изменены, и перезапустится, как описано в статье Тома Кайта, и выберет следующую группу строк.
Если вы на 11g, есть SKIP LOCKED, который вы можете использовать. Это присутствует, но недокументировано, в более ранних версиях. Так что там будет использовать на свой страх и риск.
http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/statements_10002.htm#SQLRF01702
Таким образом, вы бы
SELECT primary_key BULK COLLECT INTO pk_variable_array FROM D_Q1
WHERE DQ1_BAT_ID is null
AND DCT_ID = in_contentType_id
AND ROWNUM < (in_work_size + 1)
FOR UPDATE SKIP LOCKED;
--
FORALL i in 1..pk_variable_array
UPDATE D_Q1
SET DQ1_BAT_ID = in_batch_id
WHERE primary_key = pk_variable_array(i)