Pregunta

Estoy usando .Net 2.0, ADO.NET, un conjunto de datos y adaptadores de datos para administrar mis datos, y Microsoft SQL Server 2005 como administrador de base de datos.

Tengo una aplicación que genera una gran cantidad de resultados (500 K +) y los guarda en una base de datos. Si una generación de resultados falla, me gustaría no guardar ninguno de los resultados. Así que puse todas las inserciones de la base de datos dentro de una transacción que se deshace si no se puede generar un resultado.

Sin embargo, la tabla se bloquea hasta que se escriben todos los resultados, que no es lo que pretendía. O al menos supongo que está bloqueado, ninguna consulta SELECT responde hasta que finaliza la inserción.

¿Hay alguna forma de que la transacción no bloquee la tabla mientras una transacción está activa?

¿Es incluso una buena idea utilizar una transacción con tantas inserciones realizadas?

¿Fue útil?

Solución

Puedes usar la tabla de preparación temporal. Llénalo a tu ritmo. Luego ejecute el movimiento final con un SELECT INTO como una sola transacción. Después de hacer un gran movimiento, suelta la tabla de preparación.

Si hay algunas restricciones más estrictas sobre la integridad general, puede introducir más tablas livianas, tablas que reflejen etapas del flujo de datos, tablas de diario / registro. Algunas rutinas de recuperación / compensación / limpieza, etc.

Otros consejos

Es posible que desee considerar la posibilidad de dividir la transacción en lotes más pequeños, confirmando después de cada 1k o algo así.

Puede superar el bloqueo especificando la sugerencia WITH (NOLOCK) en su declaración de selección (póngala justo después del nombre de la tabla), pero tenga mucho cuidado ya que leerá los datos que no tienen ha cometido (es decir, algo que podría ser revertido). También existe la sugerencia WITH (ROWLOCK) que puede usarse con su inserción, lo que puede reducir la posibilidad de bloquear la selección (aún se producirá un bloqueo si intenta acceder a una fila que se ha insertado por una transacción no confirmada, pero SQL no eliminará bloqueos en toda la tabla, por lo que es menos probable).

Puede encontrar más información en las sugerencias de tabla aquí , solo Ten mucho cuidado con ellos ya que pueden afectar el rendimiento. Espero que ayude.

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