Sql Server 2005 - gestionar concurrencia en tablas

votos
1

Tengo en una aplicación ASP.NET este proceso:

  • Comience una conexión
  • Comience una transacción
  • Inserte en una tabla LoadData muchos valores con la clase SqlBulkCopy con una columna que contenga un LoadId específico.
  • Llame a un procedimiento almacenado que:
    • lea la tabla LoadData para el LoadId específico.
    • Para cada línea se realizan muchos cálculos que implican leer docenas de tablas y escribir los resultados en una tabla temporal (#temp) (proceso que dura varios minutos).
    • Elimina las líneas en LoadDate para el LoadId específico.
    • Una vez que todo está hecho, escriba el resultado en la tabla de resultados.
  • Confirmar transacción o reversión si algo falla.

Mi problema es que si tengo 2 usuarios que inician el proceso, el segundo tendrá que esperar a que el anterior haya terminado (porque el inserto parece poner un bloqueo exclusivo en la tabla) y mi aplicación a veces cae en tiempo de espera (y el los usuarios no están contentos de esperar :)).

Estoy buscando una manera de poder tener los usuarios que hacen todo en paralelo ya que no hay interacción, excepto la última: escribir el resultado. Creo que lo que me bloquea es las inserciones / eliminaciones en la tabla LoadData. Revisé los otros niveles de aislamiento de la transacción, pero parece que nada podría ayudarme.

Lo que sería perfecto sería poder eliminar el bloqueo exclusivo en la tabla LoadData (¿es posible forzar que SqlServer solo bloquee las filas y no la tabla?) Cuando finalice la inserción, pero sin finalizar la transacción.

¿Cualquier sugerencia?

Publicado el 09/12/2008 a las 14:38
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
1

si está seguro de que no hay ningún problema con las operaciones de cioncorriente, excepto la última parte, ¿por qué no iniciar la transacción justo antes de esas últimas declaraciones, independientemente de cuáles sean las que EXIGEN aislamiento?), y comprometerse inmediatamente después de que tengan éxito. Entonces todo el las operaciones de lectura no se bloquearán entre sí ...

Respondida el 09/12/2008 a las 15:24
fuente por usuario

votos
1

Buscar SET TRANSACTION ISOLATION LEVEL LEA COMMIDTED SNAPSHOT en Books OnLine.

Respondida el 09/12/2008 a las 15:04
fuente por usuario

votos
1

Las transacciones deben cubrir piezas pequeñas y de ejecución rápida de SQL / código. Tienen una tendencia a implementarse de manera diferente en diferentes plataformas. Bloquearán las tablas y luego expandirán el bloqueo a medida que crezcan las modificaciones, impidiendo que los otros usuarios consulten o actualicen la misma fila / página / tabla.

¿Por qué no olvidar la transacción y manejar los errores de procesamiento de otra manera? ¿Su integridad de datos está realmente asegurada por la transacción o puede prescindir de ella?

Respondida el 09/12/2008 a las 14:43
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more