2010-02-15 18 views
12

sto ottenendo l'errore dall'applicazione come segue con SQL Server 2005transazione conteggio dopo EXECUTE indica che una dichiarazione COMMIT o ROLLBACK TRANSACTION manca - SQL server 2005

"count transazioni dopo EXECUTE indica che un COMMIT o ROLLBACK TRANSACTION manca. conteggio precedente = 1, conteggio corrente = 0"

Come posso trovare la fase in cui viene generato questo errore?

Come è possibile trovare la transazione mancante o la stored procedure in cui non viene eseguito il commit o il rollback?

risposta

13

Non penso che manchi qualcosa. Probabilmente è una stored procedure interna che viene richiamata da una transazione (TRANCOUNT = 1), avvia la propria transazione (TRANCOUNT = 2) e quindi la riporta indietro. Bene, significa rollback, ma il rollback ha effetto su tutte le transazioni e non solo su quelle più interne, quindi la procedura azzera il flusso di esecuzione.

Un modo per trovare il posto dipende dagli strumenti/competenze disponibili. Un modo migliore è usare SQL Profiler che mostra tutti i comandi eseguiti da un'applicazione sul server. Scopri la procedura memorizzata più esterna e passa attraverso il suo codice alla ricerca di eventuali altre chiamate di procedura.

+0

Se si utilizzano transazioni denominate, è possibile utilizzare 'ROLLBACK {nome transazione}' che restituisce solo la transazione denominata. – AakashM

+2

No, non puoi. '{nome transazione}' può essere solo il nome della transazione più esterna. Puoi creare un punto di salvataggio, ma questa è una cosa diversa. – GSerg

+0

Oh, mio ​​errore, ho letto male i documenti. – AakashM

3

La funzione di sistema @@TRANCOUNT restituirà il numero di transazioni in cui ci si trova attualmente. Come parte dell'investigazione, inserire le dichiarazioni PRINT @@TRANCOUNT o SELECT @@TRANCOUNT nei punti appropriati per vedere cosa non funziona.

1

che in genere significa che si erano transazioni nidificate e che c'era un ROLLBACK. in realtà non fornisci alcuna informazione sul codice in esecuzione, stored procedure, SQL dinamico, ecc. Quindi questa è solo una supposizione, ma farei una ricerca per "ROLLBACK" e aggiungere PRINT o INSERT INTO YourErrorLogTable dopo ognuno, make certo che il contenuto sia abbastanza unico da determinare quale ROLLBACK è stato colpito. Un'altra cosa che puoi provare è aggiungere dei blocchi TRY - CATCH dove includi PRINT o INTO YourErrorLogTable nel CATCH. Se fornisci ulteriori dettagli sul codice che viene chiamato (procedure nidificate, stai utilizzando blocchi try-catch, sql dinamico, linq, ecc.), Potrei darti consigli più specifici su come trovare il problema.

1

Verificare se si dispone di comando di ritorno prima COMMIT TRAN o ROLLBACK TRAN. Questo è un errore normale perché il comando di ritorno termina la procedura e non c'è alcuna possibilità di farlo COMMIT.

Problemi correlati