2016-07-16 3 views
0

Nous avons un nouveau sp qui est publié et lors des tests, nous avons constaté que lorsqu'il exécute son blocage d'autres transactions OLTP. Nous avons constaté qu'au début, c'était parce que le nouveau sp provoquait une escalade de verrouillage sur une table et que nous réduisions le nombre de tailles de lots et que nous pouvions éviter cela. même après avoir évité l'escalade des verrous, il bloque toujours les transactions oltp qui arrivent. Je pense que c'est bloquer la même ligne que la transaction oltp est en train de mettre à jour.Meilleur moyen de suivre les verrous - SQL Server

Je dois trouver un moyen de suivre tous les verrous détenus et relâchés par le nouveau sp. J'ai essayé trace/xevents (lock acquis/release) et il ne ressemble pas à sa capture tout le verrou, peut-être parce que cela arrive si vite. Juste pour comprendre à quoi ressemble le verrou acquis, je l'ai testé en faisant un select * from atable. mais cela me donne des résultats différents. Lorsque nous sélectionnons * doesnt il met une série de verrous de page, donc je devrais voir verrous de page partagée dans la trace. mais tout ce que je vois, c'est que le verrou est acquis et libéré.

Quelle est la meilleure façon de suivre tous les verrous pour une transaction donnée?

+0

événements étendus devraient avoir Caug ht ça. Pouvez-vous mettre à jour votre message avec la définition de session? –

Répondre

1

j'ai couru ci-dessous requête sur une session

begin tran 
update orderstst 
set unitprice=unitprice+1 
waitfor delay '00:00:20' 

et couru ci-dessous dmv pendant que la requête est en cours d'exécution sur les autres .. séance

select resource_database_id,request_mode,request_type,request_status,txt.text 
from sys.dm_tran_locks lck 
join 
sys.dm_exec_requests ec 
on ec.session_id=lck.request_session_id 
    cross apply 
    sys.dm_exec_Sql_text(ec.sql_handle) txt 

Je suis arrivé ci-dessous les données ...

enter image description here

lorsque la transaction n'est pas encore validée, mais terminée, j'ai couru au-dessus de dmv à nouveau. mais n'a pas obtenu de sortie.since cela n'est pas en cours d'exécution.

Mais en cours d'exécution ci-dessous dmv, va encore me donner verrouiller toutes les informations de tenue de sessions locks..so vous serez en mesure d'identifier quelle session tient plus de verrous

select resource_database_id,request_mode,request_type,request_status 
from sys.dm_tran_locks lck 
join 
sys.dm_exec_sessions ec 
on ec.session_id=lck.request_session_id 

Au-dessus de requête me donne ci-dessous les informations ..

enter image description here

donc, en résumé, vous devez exécuter DMV1 ou DMV2 pendant une certaine période par l'emploi d'agent sql et l'insérer dans une table pour analaysis plus tard ..

En outre de SQL 2012, vous pouvez également utiliser des événements étendus ..

Accédez à Gestion -> Événements étendus, cliquez avec le bouton droit de la souris et lancez l'assistant de nouvelle session.

Donnez-lui un nom et vérifiez début au démarrage du serveur

enter image description here

écran suivant vous donne une option pour sélectionner le modèle par défaut ou non, je choisis modèle par défaut pour les serrures comme illustré ci-dessous et cliquez sur suivant ..

enter image description here

dans l'écran suivant, vous pouvez choisir différents événements, dans le canal, sélectionnez tous les canaux et faire la même chose dans les catégories et aussi sélectionner les événements de votre intér t, je choisis ci-dessous ..

enter image description here

Dans cet écran, vous pouvez sélectionner des actions, je choisis le texte, IdSession

enter image description here

Dans l'écran suivant, filtre comme, disons, par exemple ..gather événements que pour un databasename comme 'somename' ou requête comme un texte ..

enter image description here

Écran suivant est l'endroit où vous pouvez enregistrer le fichier sur le disque pour une analyse ultérieure ..

enter image description here

repos complet d'écrans et enfin sélectionnez Session d'événement déclencheur immédiatement l'option ..

Lorsque vous avez terminé la collecte des données , à des événements prolongés et arrêter la session que vous cliquez created.Right et dire la cible de vue data..which ci-dessous indique screenn

enter image description here

+0

Malheureusement, l'application OLTP est très sensible et doit avoir un temps de réponse inférieur à 200 ms pour certaines transactions. Les blocages sont donc courts et les transactions tournent autour de 400-800ms. Donc, malheureusement, le travail prévu pourrait manquer le moment exact .. c'est pourquoi j'essaye d'analyser les serrures exactes et infacter les rangées qui se bloquent. Je me demandais si je pouvais modifier un paramètre dans xevents pour capturer tous les verrous acquis. J'expérimente avec xe – jesijesi

+0

utilisez-vous 2012? comment la transaction est-elle exécutée ou complétée avec moins de 800 ms d'impact? – TheGameiswar

+0

Bonjour, nous utilisons 2014. L'application (financière) a un sla strict. Donc, en tant que partie de ces transactions sur le db ne devrait pas prendre plus de 200ms. – jesijesi