En retard, j'ai été confronté à de nombreuses controverses sur le verrouillage des lignes. Le tableau litigieux semble être un tableau particulier.
C'est généralement ce qui se passe -
- Le développeur 1 démarre une transaction à partir de l'écran frontal d'Oracle Forms
- Le développeur 2 démarre une autre transaction, à partir d'une session différente en utilisant le même écran
~ 5 minutes plus tard, le front-end semble ne pas répondre. La vérification des sessions montre un conflit de verrouillage de ligne. La "solution" que tout le monde lance est de tuer les sessions: /
En tant que développeur de base de données
- Que peut-on faire pour éliminer les conflits de verrouillage de ligne?
- Serait-il possible de savoir quelle ligne d'une procédure stockée est à l'origine de ces contentions de verrouillage de ligne
- Quelle serait la ligne directrice générale pour réduire / éviter / éliminer ces problèmes de codage?
Si cette question vous semble trop ouverte / informations insuffisantes, n'hésitez pas à modifier / faites-moi savoir - je ferai de mon mieux pour ajouter des informations supplémentaires.
Le tableau en question est sous beaucoup d'inserts et de mises à jour, je dirais que c'est l'un des tableaux les plus occupés. Le SP est assez complexe - pour simplifier - il récupère les données de différentes tables, les remplit dans des tables de travail, de nombreuses opérations arithmétiques se produisent sur la table de travail et le résultat de la table de travail est inséré / mis à jour dans la table en question.
La version de la base de données est Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit. Le flux de logique est exécuté dans le même ordre dans les deux sessions, la transaction n'est pas maintenue ouverte trop longtemps (ou du moins je pense ) et les verrous se produisent pendant l'exécution active des transactions.
Mise à jour: le nombre de lignes du tableau est plus important que prévu, à environ 3,1 millions de lignes. De plus, après avoir retracé une session, j'ai constaté que quelques instructions de mise à jour de cette table n'utilisaient pas l'index. Pourquoi en est-il ainsi - je n'en suis pas sûr. La colonne référencée dans la clause where est indexée. Je reconstruis actuellement l'index.
COMMIT
ou ROLLBACK
dans un délai raisonnable ou b) de faire en sorte que les mêmes personnes ne veuillent pas toujours la même ligne en même temps.