Ich fand und Artikel in der MSDN-Bibliothek, die erklärt, dass try/catch keine Fehler behandelt, die ausgelöst werden, wenn ein Objekt nicht gefunden werden kann. Also, auch wenn ich eine Transaktion in einem try/catch wickeln, wird die Rollback-Satz nicht ausführen:Transaktionsfehler behandeln, wenn Objekte nicht vorhanden sind
BEGIN TRY
BEGIN TRANSACTION
SELECT 1 FROM dbo.TableDoesNotExists
PRINT ' Should not see this'
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
SELECT
ERROR_MESSAGE()
END CATCH
--PRINT 'Error Number before go: ' + CAST(@@Error AS VARCHAR)
go
PRINT 'Error Count After go: ' + CAST(@@Error AS VARCHAR)
PRINT 'Transaction Count ' + CAST(@@TRANCOUNT AS VARCHAR)
Was ist der empfohlene Weg, um Fehler geworfen zu handhaben, wenn ein Objekt nicht nicht vorhanden ist, vor allem, wenn es eine Transaktion beteiligt ist . Sollte ich dieses Bit Code anstelle der letzten zwei print-Anweisungen anheften:
IF @@ERROR <> 0 AND @@TRANCOUNT > 0
BEGIN
PRINT 'Rolling back txn'
ROLLBACK TRANSACTION
END
go
PRINT 'Transaction Count again: ' + CAST(@@TRANCOUNT AS VARCHAR)
Manchmal in dynamischen Umgebungen, Sie wissen nicht, das genaue Schema ; Ein anderer Prozess könnte die Datenbankstruktur ändern. Daher ist es wichtig, dass die normale try/catch-Ausnahmebehandlung wie normal funktioniert. –
Messepunkt. Ja, die Try/Catch-Behandlung sollte korrekt funktionieren, aber ich habe MS nicht verteidigt. Ich stimme dieser Verwendung einer Datenbank einfach nicht zu. – Tony
Tony, dieses Szenario kommt in unserer Test- und Entwicklungsumgebung auf, in der mehrere Entwickler gleichzeitig an Änderungen arbeiten, die sie vornehmen. Dies ist eine Situation, über die ich keine Kontrolle habe, also kann ich sie nicht ändern. Da jedoch Änderungen an Objekten im Test auftreten können, muss ich in der Lage sein, Fehler zu behandeln, die von fehlenden Objekten erzeugt werden, und ich dachte, der try/catch-Mechanismus sollte damit umgehen können. Da es nicht versucht, herauszufinden, die beste Möglichkeit, Transaktionen zu verwenden, damit die Änderungen, für die ich verantwortlich bin, nicht in einem inkonsistenten Zustand enden. – gr928x