la forma de detectar el tiempo de espera del servidor SQL de la aplicación .NET sin necesidad de utilizar la captura de excepciones
-
01-10-2019 - |
Pregunta
En mi aplicación actual, estoy realizando una actualización mediante la invocación de comandos T-SQL de actualización. El problema es cuando el mismo registro está bloqueado por otros usuarios en ese momento.
En la aplicación .NET, la aplicación va a esperar hasta que el tiempo de espera de SQL Server, a continuación, se lanzará el tiempo de espera SqlException.
¿Es posible realizar una comprobación en primer lugar si un determinado registro está bloqueado por otro proceso en lugar de agarrar la excepción?
Solución
No, no realmente.
La forma habitual es utilizar try/catch
y mango SqlException
Número 1205
(punto muerto víctima), y vuelva a intentar su consulta:
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
...
}
}
[Nota: las sentencias break no se añaden a la compacidad
nota también , muchos problemas de bloqueo puede ser eliminada, proporcionando la adecuada relativa a los índices.
Otros consejos
Se podría usar una conexión independiente con muy poco tiempo de espera para intentar bloquear el registro mediante la actualización de algún campo, pero esto todavía no se va a dar el 100% de fiabilidad.
si realmente tiene la situación con múltiples usuarios edición mismos registros, se deberán tener en cuenta las técnicas de bloqueo optimista.
Además, asegúrese de que no permiten a los usuarios bloquear los registros en todos - el uso modo desconectado para cualquier actualización. En otras palabras, el bloqueo ocurrirá solamente por un corto tiempo de actualización (<100 ms)