transaction - SQLException-Transacción BEGIN/COMMIT mismatch
throw sql server 2008 (5)
¿Estás seguro de que no tienes un camino que produzca esto?
BEGIN TRAN
ROLLBACK TRAN
COMMIT TRAN
¿Ha encontrado esta excepción para un procedimiento almacenado que sí tiene un bloque de transacción balanceado?
Comprobé dos veces el procedimiento almacenado y tiene exactamente un COMIENZO DE TRANSACTION END
DE TRANSACTION END
corespondiente
Error registrado
SqlException - Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 1, current count = 0. The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION. - Delete failed - stack: at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) at System.Data.SqlClient.S ... [Rest of stack trace truncated by logging system]`
Información adicional
El procedimiento almacenado contiene llamadas EXEC
a otro procedimiento almacenado. ¿Un par de transacciones no coincidentes aquí causaría que el error salga a la superficie de esta manera?
Actualización Resulta que hubo una violación de una restricción de clave externa dentro del procedimiento almacenado anidado. La transacción externa no incluía un bloque Try / Catch y tenía SET XACT_ABORT ON
especificado, que no manejaba adecuadamente ni una confirmación ni una retrotracción. También se agregó un cheque para @@ TransactionCount> 0 antes de intentar una reversión
Sí lo haría. Cada BEGIN incrementa @@trancount
, cada confirmación lo disminuye. Solo cuando el conteo llega a 0 la transacción está realmente comprometida. Su procedimiento, como persona que llama, no puede controlar esto. Es el trabajo de los procedimientos llamados comportarse correctamente y equilibrar el recuento COMIENZO y COMPROMISO; si alguno de los procedimientos invocados tiene un desequilibrio, verá este error.
Sí, vas por el camino correcto. Si una llamada de procedimiento anidado crea transacciones, afectan el procedimiento de llamada.
Verificar ese otro procedimiento
Agregue esto encima del texto de creación PROCEDIMIENTO
SET XACT_ABORT ON;
Garantizará que si no se ejecuta nada, la transacción se cancela por completo.
MSDN Doc: http://technet.microsoft.com/en-us/library/ms188792(v=sql.105).aspx
Asegúrate de no haber escrito inadvertidamente
return
commit
en lugar de
commit
return
Para mí, ese fue el problema.