Pregunta

Tengo la aplicación C # Windows. Cuando el botón '1' haga clic en 'Formulario 1' Tengo un proceso que escribió datos en pocas tablas.Ese proceso normalmente toma 10 minutos. Cuando un usuario hace clic en ese botón '1', otro usuario que usa el mismo DB y el programa haciendo clic en otro botón en otro formulario que inserta datos a las mismas tablas.

Cuando haga clic en el botón 1, estoy iniciando la transacción SQL y estoy cometiendo que después de terminar el proceso.

El problema es cuando se ejecuta ese proceso, el segundo usuario recibe un error de tiempo y no puede completar su proceso.

¿Qué puedo hacer por esto? Cuando el inicio de la transacción SQL es el bloqueo de las tablas que se utilizan para el proceso?

¿Fue útil?

Solución

¿Qué puedo hacer por esto?

volver a trabajar su manejo de transacciones.En serio.

ese proceso normalmente tomando 10 minutos

Una transacción de 10 minutos no es práctica por ningún medio.No veo ninguna razón para esto fuera de la COMPECCIÓN MALA, y estoy haciendo trabajo de base de datos para tal vez 20 años en total.Nunca toleré y tuvo una necesidad real de transacciones que duran, normalmente hay una manera de evitarlo.

Sí, podría cambiar un tiempo de espera, pero eso significa que el usuario 2 miró a la pantalla durante 15 minutos.No es una solución real.

Repare su transacción desde un punto de vista lógico.¿Qué diablos haces allí que tarda 10 minutos en comenzar?

Otros consejos

Solución simple , pero puede necesitar que el usuario espere durante mucho tiempo.

Si está utilizando un hilo para lograr esto (WinForm) con Label1 como el estado de trabajo

   void transaction(data)
    { 
     try
     {
       thread.sleep(100);
       sqltransaction(data);//whatever your code is
     }
    catch(Exception)
     {
       transaction(data);
       label1.Invoke((MethodInvoker)(() => label1.Text = "Requested pending , do not close the program";
     }
       label1.Invoke((MethodInvoker)(() => label1.Text = "Working...";
    }

Esta es la forma en que generalmente manejo un error que realmente no puedo arreglarlo.

gracias

Una transacción es, por definición, bloqueando otras transacciones de acceso a los mismos recursos porque es la forma en que el servidor SQL garantiza que los datos se persisten en la confirmación y no cambia la otra persona. Es el

Entonces, lo que puede hacer es hacer que su transacción se ejecute más rápido, por lo que no bloquee y se bloquea durante mucho tiempo. Aplicar más tiempo espere al segundo usuario. O no usar transacciones en absoluto. (o maneje la situación "mejor" en su capa de código, si es "comportamiento esperado")

También puede verificar sus transacciones que no bloquee demasiado, pero si el segundo proceso realmente necesita acceder a los mismos recursos, tendrá que esperar.

Sin embargo, si realmente desea obtener "sucio", puede cambiar los niveles de aislamiento para que el servidor permita la lectura de datos sucios, pero eso no es absolutamente algo que aconseje a menos que sepa lo que está haciendo. Pero es algo que puede acelerar las consultas de lectura, pero puede tener consecuencias bastante extrañas, leer datos sucios y páginas de datos sucios.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top