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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top