comment détecter timeout serveur SQL d'une application .NET sans utiliser des captures d'exception
-
01-10-2019 - |
Question
Dans ma demande actuelle, j'effectue une mise à jour en invoquant la commande T-SQL de mise à jour. Le problème est quand le même enregistrement est verrouillé par d'autres utilisateurs à ce moment-là.
A l'application .NET, l'application attendra jusqu'à ce que TEMPORISATION SQL Server, il lancera le délai d'attente SqlException.
Est-il possible d'effectuer une vérification d'abord si un enregistrement particulier est verrouillé par un autre processus plutôt que d'attraper l'exception?
La solution
Non, pas vraiment.
La méthode standard consiste à utiliser try/catch
et poignée SqlException
Nombre 1205
(victime de blocage), et recommencez votre requête:
try
{
// do stuff...
}
catch (SqlException sqlEx)
{
switch (sqlEx.Number)
{
case -2: // Client Timeout
case 701: // Out of Memory
case 1204: // Lock Issue
case 1205: // >>> Deadlock Victim
// handle deadlock
break;
case 1222: // Lock Request Timeout
case 2627: // Primary Key Violation
case 8645: // Timeout waiting for memory resource
case 8651: // Low memory condition
...
}
}
[Note: Les déclarations de rupture non ajouté pour la compacité
Notez également , de nombreux problèmes de verrouillage peut être éliminé en fournissant les indices de couverture approprié.
Autres conseils
Vous pouvez utiliser une connexion séparée avec délai très court pour tenter de verrouiller l'enregistrement en mettant à jour un champ, mais cela ne va pas encore vous donner une fiabilité à 100%.
si vous avez vraiment la situation avec plusieurs utilisateurs d'édition mêmes enregistrements, vous devriez regarder dans les techniques de verrouillage optimistes.
En outre, assurez-vous que vous ne permettez pas aux utilisateurs de verrouiller les enregistrements du tout - utilisez le mode déconnecté pour les mises à jour. En d'autres termes, le verrouillage ne se produira que pendant une courte période de mise à jour (<100 ms)