Un blocage se produit lorsque la transaction A verrouille un enregistrement doit alors attendre la transaction B pour déverrouiller un enregistrement, alors que la transaction B est en attente sur un dossier déjà verrouillé par transaction A.
Oracle dispose d'un mécanisme assez sophistiqué pour gérer les modifications apportées aux tables au cours d'une mise à jour. Voir
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:11504247549852
En général, le risque d'un blocage augmente le plus court une transaction et les données plus un changement de transaction. Je dirais qu'il est peu probable que cela se bloque, mais il risque de faire la queue - si vous avez trois ou quatre sessions simultanées exécutant ce SQL, chaque session aura le même chemin d'exécution pour le SQL, identifiera les mêmes lignes pour la mise à jour, l'un arrivera en premier, les autres attendront. Lorsque cette première transaction est terminée, une autre réintègre les enregistrements, trouve qu'ils sont modifiés et redémarre comme décrit dans l'article de Tom Kyte et sélectionne le prochain groupe de lignes.
Si vous êtes sur 11g, il y a un SKIP LOCKED que vous pouvez utiliser. Il est présent, mais non documenté, dans les versions antérieures. Donc, il serait utilisé à vos risques et périls.
http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/statements_10002.htm#SQLRF01702
De cette façon, vous auriez
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)
Wow, j'ai lu la réponse de Tom Kyte référencée dans la réponse de Gary ci-dessous. Très sympa! Cela signifie que si la transaction bloque, elle sera redémarrée, donc elle ne devrait pas être bloquée. –