8

En mi aplicación actual, estoy realizando una actualización invocando el comando T-SQL Update. El problema es cuando el mismo registro está bloqueado por otros usuarios en ese momento.cómo detectar el tiempo de espera del servidor sql desde la aplicación .NET sin utilizar catch Exception

En la aplicación .NET, la aplicación esperará hasta el tiempo de espera de SQL Server, y lanzará el tiempo de espera de SqlException.

¿Es posible verificar primero si un registro en particular está bloqueado por otro proceso en lugar de detectar la excepción?

Respuesta

22

No, realmente no.

La forma habitual es utilizar try/catch y manejar 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

También tenga en cuenta , muchos problemas de bloqueo se pueden eliminar proporcionando los índices de cobertura adecuados.

0

Puede utilizar una conexión separada con un tiempo de espera muy corto para intentar bloquear el registro actualizando algún campo, pero esto no le dará una confiabilidad del 100%.

si realmente tiene la situación de que varios usuarios editen los mismos registros, debe buscar técnicas de bloqueo optimistas.

Además, asegúrese de no permitir que los usuarios bloqueen los registros en absoluto: use el modo desconectado para cualquier actualización. En otras palabras, el bloqueo solo se producirá durante un breve período de tiempo de actualización (< 100 ms)

Cuestiones relacionadas