Oracle
 sql >> Base de données >  >> RDS >> Oracle

Conflit de ligne oracle provoquant des erreurs de blocage dans l'application JMS à haut débit

Un blocage implique que chaque thread essaie de mettre à jour plusieurs lignes dans une seule transaction et que ces mises à jour sont effectuées dans un ordre différent sur les threads. La réponse la plus simple possible serait donc de modifier le code afin que les messages d'une même transaction soient appliqués dans un ordre défini (c'est-à-dire dans l'ordre de la clé primaire). Cela garantirait que vous n'obtiendriez jamais de blocage, bien que vous obteniez toujours des verrous bloquants pendant qu'un thread attend qu'un autre thread valide sa transaction.

En prenant du recul, cependant, il semble peu probable que vous vouliez vraiment que de nombreux threads mettent à jour la même ligne dans une table lorsque vous ne pouvez pas prédire l'ordre des mises à jour. Il semble très probable que cela entraînerait de nombreuses mises à jour perdues et un comportement plutôt imprévisible. Que fait exactement votre application qui rendrait ce genre de chose sensé ? Faites-vous quelque chose comme mettre à jour des tables agrégées après avoir inséré des lignes dans une table détaillée (c'est-à-dire mettre à jour le nombre de vues d'un article en plus de consigner des informations sur une vue particulière) ? Si oui, ces opérations doivent-elles vraiment être synchrones ? Ou pourriez-vous mettre à jour le nombre de vues périodiquement dans un autre fil en agrégeant les vues au cours des N dernières secondes ?