Ma compréhension des deadlocks est – deux process essayant de lutter pour la même ressource – généralement deux process essayant d'écrire sur la même ligne de données. Si tout ce que fait un process consiste à lire datatables – et que l'autre process met à jour datatables, en quoi cela constitue-t-il un conflit de ressources? Pourtant, dans notre database, qui est définie sur le niveau de transaction par défaut 'ReadCommitted', nous voyons plusieurs exceptions de blocage. ReadComitted definitin – Les données qui ont été modifiées (mais pas encore validées) ne peuvent pas être lues. C'est bien – mais SQL Server devrait-il lancer une exception de blocage s'il rencontre cette "lecture sale"? Quelqu'un a une expérience du monde réel avec ce scénario? J'ai trouvé un billet de blog (par le développeur de stackoverflow, pas less 🙂 affirmant que cela pourrait être vrai.
Merci
Oui, cela peut arriver. Imaginez que vous ayez deux process chacun avec sa propre transaction. La première mise à jour TableA tente ensuite de mettre à jour TableB. La seconde mise à jour TableB tente ensuite de mettre à jour TableA. Si vous êtes malchanceux, les deux process parviennent à compléter leur première étape et attendent ensuite indéfiniment à l'autre afin de compléter la deuxième étape.
Incidemment, c'est l'une des façons les plus courantes d'éviter les blocages: soyez cohérents dans l'ordre dans lequel vous mettez votre table à jour. Si les deux process mettaient à jour TableA en premier, puis TableB, le blocage ne se produirait pas.
ReadComitted Transaction Isolation Level obtient initialement un Shared Lock
sur une ressource, c'est-à-dire en lisant la ligne, mais lorsque nous essayons de mettre à jour la ligne, elle obtient un Exclusive lock
sur les ressources. Plusieurs users peuvent avoir des verrous partagés sur les mêmes lignes et cela n'a pas d'effet mais dès qu'un user tente de mettre à jour une ligne Il obtient un verrou exclusif sur la ligne qui peut entraîner un dead lock
lorsqu'un user qui voit initialement l'logging en raison de les verrous partagés sur la ligne mais maintenant lorsque l'user essaie de le mettre à jour Il a déjà un verrou exclusif sur le premier user. Imaginez un scénario dans lequel User1 et User2 Both ont des verrous partagés et lorsqu'ils essaient de mettre à jour certains loggings, ils obtiennent tous les deux des verrous Exclusive sur les lignes dont les autres users ont besoin pour valider la transaction. Cela entraînera un VERROUILLAGE MORT.
Dans le cas d'un DeadLock si le Priority Level is not set
SQL Server attendra un certain time, puis RollBack
la transaction qui est cheaper
à restaurer.
modifier
Oui si User1 ne lit que datatables et User2 essaie de mettre à jour certaines données et qu'il y a un index non clusterisé sur cette table, c'est possible.
1) User1 lit Some Data et obtient un verrou partagé sur l'index non cluster afin d'effectuer une search, puis essaie d'get un verrou partagé sur la page contenant datatables afin de renvoyer datatables elles-mêmes.
2) Utilisateur2 qui écrit / met à jour en premier obtient un verrou exclusif sur la page de database contenant datatables, puis tente d'get un verrou exclusif sur l'index afin de mettre à jour l'index.