2010-02-15 6 views
12

Dostaję błąd w aplikacji, jak następuje z serwera SQL 2005transakcja count po EXECUTE wskazuje, że COMMIT lub ROLLBACK TRANSAKCJI oświadczenie brakuje - serwer SQL 2005

„Liczba transakcji po EXECUTE wskazuje, że COMMIT lub ROLLBACK TRANSAKCJI brakuje. Poprzedni count = 1, bieżący count = 0"

Jak mogę znaleźć scenę gdzie ten błąd jest podniesiona?

Jak znaleźć brakującą transakcję lub procedurę składowaną, jeśli nie została ona zatwierdzona lub została wycofana?

Odpowiedz

13

Nie sądzę, że czegoś brakuje. Jest to prawdopodobnie wewnętrzna procedura składowana, która jest wywoływana z poziomu transakcji (TRANCOUNT = 1), rozpoczyna własną transakcję (TRANCOUNT = 2), a następnie wycofuje ją. Cóż, oznacza to cofnięcie, ale wycofanie wpływa na wszystkie transakcje, a nie tylko na najbardziej wewnętrzną, więc procedura zawęża przepływ wykonania.

Sposób na znalezienie miejsca zależy od dostępnych narzędzi/umiejętności. Lepszym sposobem jest użycie programu SQL Profiler, który pokazuje wszystkie polecenia wykonywane przez aplikację na serwerze. Znajdź najbardziej zewnętrzną procedurę przechowywaną i przejdź przez jej kod, szukając innych wywołań procedur.

+0

Jeśli używane są transakcje o podanej nazwie, można użyć 'ROLLBACK {nazwa transakcji}', która wycofuje tylko nazwaną transakcję. – AakashM

+2

Nie, nie możesz. '{nazwa transakcji}' może być tylko nazwą najbardziej zewnętrznej transakcji. Możesz jednak utworzyć punkt zapisu, ale to coś zupełnie innego. – GSerg

+0

Och, mój błąd, błędne przeczytanie dokumentów. – AakashM

3

Funkcja @@TRANCOUNT system powróci ile transakcje są obecnie. W ramach swojego dochodzenia, włóż PRINT @@TRANCOUNT lub SELECT @@TRANCOUNT oświadczenia w odpowiednich miejscach, aby zobaczyć, co się dzieje źle.

1

co zwykle oznacza, że ​​zostały zagnieżdżone transakcje i wystąpiło ROLLBACK. tak naprawdę nie podajesz żadnych informacji o uruchomionym kodzie, procedurach przechowywanych, dynamicznym SQL itp. Więc to tylko domysły, ale chciałbym wyszukać "ROLLBACK" i dodać PRINTy lub INSERTs INTO YourErrorLogTable po każdym, make upewnić się, że treść jest wystarczająco unikalna, aby określić, co zostało uderzone ROLLBACK. Inną rzeczą, którą możesz spróbować, jest dodanie bloków TRY - CATCH, w których dodajesz PRINT lub INTO YourErrorLogTable w CATCH. Jeśli podasz więcej szczegółów na temat wywoływanego kodu (procedury zagnieżdżone, korzystasz z bloków try-catch, dynamicznego sql, linq, itp.), Mogę udzielić ci bardziej szczegółowej porady, jak znaleźć problem.

1

Sprawdź, czy masz polecenie powrotu przed COMMIT TRAN lub ROLLBACK TRAN. Jest to typowy błąd, ponieważ polecenie Return kończy procedurę i nie ma szansy na to.

Powiązane problemy