de longs temps de file d'attente pour les verrous de ligne oracle
-
19-09-2019 - |
Question
Je continue à courir dans « enq: TX - ligne de conflit de verrouillage », quand je lance la commande Sql ci-dessous dans un oracle 9 DB. Le tableau matable est une petite table, avec moins de 300 lignes.
UPDATE MYTABLE
SET col1 = col1 + :B3 ,
col2 = SYSDATE
WHERE :B2 = col3
AND :B1 = col4
Je lance 10 threads en même temps, et certains attendent aussi longtemps que 10 secondes pour obtenir une chance de mettre à jour. Je sais que je vais faire face à cette impasse questions de, mais le problème pour moi est qu'ils devraient pouvoir être beaucoup plus rapide, puisque la table est petite, il serait donc mise à jour être rapide.
modifier : Je ne peux pas modifier ce code, il est à l'intérieur d'une application tierce. Je ne peux modifier la DB.
Que puis-je faire pour améliorer la vitesse de la file d'attente tolet? Comment puis-je améliorer ce temps d'attente pour que mes fils courir plus vite?
La solution
Si vous ne voulez pas être bloqué ne pas essayer de mettre à jour aveuglément . Effectuer un SELECT FOR UPDATE NOWAIT premier. Si vous soulevez une exception (ORA-00054), cela signifie qu'une autre session travaille actuellement avec cette ligne. Dans ce cas, en fonction de vos besoins, vous pouvez essayer de mettre à jour une autre ligne (vous essayez de construire une file d'attente / processus dequeue?), Attendez (dbms_lock.sleep) ou de retourner un message d'erreur à l'application appelant.
Vous allez jamais face à une impasse si vous verrouillez la ligne avec FOR UPDATE NOWAIT premier.