try transaction error_message error ejemplos catch begin sql sql-server-2008 transactions sqlexception

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



Asegúrate de no haber escrito inadvertidamente

return commit

en lugar de

commit return

Para mí, ese fue el problema.