Tengo una aplicación que potencialmente hace miles de inserciones en una base de datos de SQL Server 2005. Si una inserción falla por alguna razón (restricción de clave externa, longitud de campo, etc.) la aplicación está diseñada para registrar el error de inserción y continuar.SqlTransaction ha completado
Cada inserción es independiente de las demás, por lo que las transacciones no son necesarias para la integridad de la base de datos. Sin embargo, deseamos usarlos para la ganancia de rendimiento. Cuando uso las transacciones obtendremos el siguiente error en aproximadamente 1 de cada 100 confirmaciones.
This SqlTransaction has completed; it is no longer usable.
at System.Data.SqlClient.SqlTransaction.ZombieCheck()
at System.Data.SqlClient.SqlTransaction.Commit()
Para tratar de localizar la causa puse rastrear declaraciones en cada operación de transacción para que pudiera garantizar la operación no estaba cerrada antes de llamar a comprometerse. Confirmé que mi aplicación no estaba cerrando la transacción. Luego volví a ejecutar la aplicación usando exactamente los mismos datos de entrada y tiene éxito.
Si apago el registro, falla nuevamente. Vuelve a encenderlo y tiene éxito. Este botón de encendido/apagado se realiza a través de app.config sin la necesidad de recompilar.
Obviamente, el acto de registrar cambia el tiempo y hace que funcione. Esto indicaría un problema de enhebrado. Sin embargo, mi aplicación no tiene múltiples subprocesos.
He visto una entrada de MS KB que indica un error con .Net 2.0 framework podría causar problemas similares (http://support.microsoft.com/kb/912732). Sin embargo, la solución que proporcionaron no resuelve este problema.
¿Usar transacciones "para la ganancia de rendimiento"? ¿De qué manera el uso de transacciones mejora el rendimiento? – LukeH
De acuerdo con luke, ¿por qué ves o crees que tienes un aumento de rendimiento al hacerlo? – eglasius
tener una transacción en torno a varias inserciones, en general, aumentar el rendimiento, probarlo usted mismo y ver. al realizar una transacción, reduce el número de bloqueos que debe adquirir antes de las inserciones –