2010-09-16 42 views
6

¿Ha encontrado esta excepción para un procedimiento almacenado que sí tiene un bloque de transacción balanceado?SQLException - Transaction BEGIN/COMMIT mismatch

Me doble comprobado el procedimiento almacenado y tiene exactamente un TRANSACTION BEGIN y cooresponding TRANSACTION END

error registrados Info

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]` 

adicional

El procedimiento almacenado contiene EXEC llamadas 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ó una marca para @@ TransactionCount> 0 antes de intentar una reversión

+0

¡La restricción de clave foránea fue de gran ayuda para mí aquí! Me encontré con un problema similar con sqlalchemy de python –

Respuesta

14

Sí que 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.

+0

http://stackoverflow.com/questions/21930156/transaction-count-after-execute-indicates-a-mismatching-number-of-begin-and-comm He publicado aquí –

2

Sí, va por el camino correcto. Si una llamada de procedimiento anidado crea transacciones, afectan el procedimiento de llamada.

Compruebe que otro procedimiento

6

¿Estás seguro de que no tiene camino que produce este

BEGIN TRAN 

ROLLBACK TRAN 

COMMIT TRAN 
1

Asegúrese de que usted no tiene inadvertidamente escrita

return 
commit 

en lugar de

commit 
return 

Para mí, ese era el problema.

Cuestiones relacionadas