Détermination du nombre de conflits d'accès au stock
Les transactions qui détiennent des verrous d'enregistrement de ligne d'article de stock peuvent bloquer d'autres transactions qui ont besoin du même enregistrement. Un certain nombre de conflits d'accès au stock est acceptable notamment si les transactions ne sont pas fréquemment bloquées ou pour de courtes périodes, et si la capacité de traitement ou les temps de réponse de l'utilisateur final n'ont pas d'incidence sur le matériel.
Détermination du niveau de conflit d'accès dans Oracle
Vous pouvez déterminer le niveau de conflit d'accès au stock grâce aux techniques suivantes. Dans Oracle :
- Utilisez AWR pour calculer le nombre de conflits d'accès.
- Dans Oracle, consultez la table v$session pour appréhender l'étendue du conflit d'accès.
Les rapports AWR fournissent une mesure du temps total (en secondes) d'attente des transactions de verrous d'enregistrement. Cette mesure figure dans la section "Wait Events for DB" (page 2) d'un rapport AWR. Dans l'exemple suivant, les transactions attendent une mise en file d'attente pendant un total de 741 secondes dans cet intervalle de mesure de 30 minutes :
Wait Events for DB: YRAC05 Instance: YRAC051 Snaps: 15202 -15203
Avg
Total Wait wait Waits
Event Waits Timeouts Time (s) (ms) /txn
---------------------------- ------------ ---------- ---------- ------ --------
db file sequential read 903,826 0 6,246 7 3.0
db file scattered read 879,659 0 4,281 5 2.9
enqueue 3,542 6 741 209 0.0
library cache pin 375 231 719 1918 0.0
buffer busy waits 116,687 0 449 4 0.4
log file sync 129,571 0 134 1 0.4
Diviser le temps total d'attente de mise en file d'attente (741 secondes) par l'intervalle de mesure (30 minutes) indique que la mise en file d'attente est en moyenne bloquée 0,41 seconde par seconde. D'un point de vue statistique, une transaction a été bloquée 41 % de chaque seconde. Si dix transactions s'exécutent simultanément, à l'extrême, ces statistiques peuvent être interprétées comme le fait que toutes les transactions ont été bloquées 4,1 % du temps. À l'inverse, une transaction pourrait être bloquée pendant 719 secondes.
Dans l'exemple ci-dessus, le conflit d'accès est minimal. À titre de bonne pratique, les situations de conflit d'accès sont caractérisées comme suit :
- Le nombre de secondes d'attente de mise en file d'attente par seconde est supérieur à 5 secondes par seconde ou
- L'attente de mise en file d'attente correspond à la première attente
Si les temps d'attente de mise en file d'attente sont significatifs, exécutez la requête suivante pour identifier les sessions bloquées, le temps pendant lequel elles ont été bloquées et les objets sur lesquels elles sont bloquées :
select sid,last_call_et, sql_text
from v$session vs, v$sqlarea sa
where last_call_et > 0 and
vs.sql_hash_value = sa.hash_value and
vs.lockwait > ' '
order by last_call_et desc;
SID LAST_CALL_ET SQL_TEXT
13 1 SELECT /*YANTRA*/ YFS_ORDER_HEADER.*
FROM YFS_ORDER_HEADER YFS_ORDER_HEADER
WHERE ENTERPRISE_KEY =:"SYS_B_0" AND
ORDER_NO = :"SYS_B_1" FOR UPDATE
Dans l'exemple ci-dessus, la session (SID=13) a été bloquée pendant 1 seconde lors de la tentative de verrouillage d'un enregistrement YFS_ORDER_HEADER.
Nous vous suggérons d'effectuer les opérations suivantes :
- Déterminez sur quels objets les transactions sont bloquées (par ex., sont-elles bloquées sur YFS_INVENTORY_ITEM ou sur une autre table).
- Déterminez pendant combien de temps ces transactions ont été bloquées. Si les blocages durent quelques secondes (par ex., 1 à 2 secondes) et que le nombre de lignes de commande par commande est faible, le niveau de conflit peut être acceptable.
Cette requête, ainsi que le niveau de conflit dérivé de AWR, vous permet de déterminer l'étendue du conflit d'accès.
Détermination du niveau de conflit d'accès dans DB2
Pour DB2, vérifiez les éléments de surveillance suivants :
- lock_wait_time pour déterminer le nombre de conflits d'accès. Si vous divisez ce nombre par l'intervalle de mesure, vous obtenez le temps d'attente sur verrouillage moyen (en millisecondes) par seconde.
- Vérifiez l'élément de surveillance table_name du moniteur snapshot_lockwait pour déterminer d'où proviennent la plupart des conflits d'accès.
- Pour chaque agent bloqué, vérifiez les éléments de surveillance stmt_text et uow_lock_wait_time dans le moniteur snapshot_statement.
Nous vous suggérons d'effectuer les opérations suivantes :
- Déterminez sur quels objets les transactions sont bloquées (par ex., sont-elles bloquées sur YFS_INVENTORY_ITEM ou sur une autre table).
- Déterminez pendant combien de temps ces transactions ont été bloquées. Si les blocages durent quelques secondes (par ex., 1 à 2 secondes) et que le nombre de lignes de commande par commande est faible, le niveau de conflit peut être acceptable.