sql >> Base de Datos >  >> RDS >> Sqlserver

Comprensión de los tiempos de espera del ámbito de transacción

Intenta verlo de esta manera:

La duración de la transacción solo se determina cuando llama a trans.Complete() o sale del alcance de la transacción. Toma el siguiente código:

using (var trans= new TransactionScope())
{
Threading.Sleep(99999);
trans.Complete()
}

No hay forma de lanzar una excepción de tiempo de espera mientras se está dentro de la rutina de sueño y no tendría sentido si lo hiciera. Y así, el uso de tiempos de espera de transacciones (al menos de esta manera) solo puede garantizar que si la transacción toma más tiempo que su tiempo de espera, no se confirmará.

Si solo está ejecutando una consulta (que no sabría para qué usa las transacciones), entonces podría establecer el tiempo de espera de consulta/comando (o como lo llame). IIRC, su consulta volverá inmediatamente después de que expire el tiempo de espera.

Otra forma sería configurar el tiempo de espera de la solicitud del servicio web y simplemente asumir que el servicio web está tardando demasiado en responder debido a lo que haya dentro de su transacción.

EDITAR:Podrías probar:

  • Generar su transacción en un subproceso diferente y luego esperar a que se complete (usando Thread.Join(timeout)) en su subproceso principal (uno utilizado por la llamada al servicio web). Entonces, si no finaliza antes del tiempo de espera que especificó, puede dejar de esperar y devolver un error de tiempo de espera (no olvide señalar al otro subproceso que cancele la transacción).
  • Suponiendo que solo está realizando consultas SQL dentro de esas transacciones, podría usar la palabra clave "BEGIN TRANSACTION" para especificar la transacción en el script sql (realmente complicado). Luego, podría especificar el tiempo de espera del comando y ejecutar todo esto en una sola línea de código. Pero luego esto requiere que mueva todo lo que hace dentro de la transacción a un script sql que puede o no ser posible para usted... y no está limpio.