Ho trovato e articolo nel MSDN Lbrary spiegando che try/catch non gestisce gli errori generati quando un oggetto non può essere trovato. Così, anche se mi avvolgo una transazione in un try/catch, la frase rollback viene eseguito:gestione errori di transazione quando gli oggetti non esistono
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)
qual è il modo consigliato per gestire gli errori generata quando un oggetto non esiste, soprattutto quando v'è una transazione coinvolti . Devo aggiungere questo bit di codice al posto delle ultime due istruzioni di stampa:
IF @@ERROR <> 0 AND @@TRANCOUNT > 0
BEGIN
PRINT 'Rolling back txn'
ROLLBACK TRANSACTION
END
go
PRINT 'Transaction Count again: ' + CAST(@@TRANCOUNT AS VARCHAR)
volte in ambienti dinamici, non si conosce lo schema preciso ; un altro processo potrebbe cambiare la struttura del database, quindi è essenziale che la normale gestione delle eccezioni try/catch funzioni normalmente. –
Punto giusto. Sì, la gestione try/catch dovrebbe funzionare correttamente ma non difendevo MS; Semplicemente non sono d'accordo con questo uso di un database. – Tony
Tony, Questo scenario si presenta nel nostro ambiente di test e sviluppo in cui diversi sviluppatori lavorano simultaneamente alle modifiche che stanno apportando. Ora questa è una situazione su cui non ho controllo, quindi non posso cambiarla. Tuttavia, poiché possono verificarsi modifiche agli oggetti nel test, devo essere in grado di gestire gli errori generati da oggetti mancanti e ho pensato che il meccanismo try/catch dovrebbe essere in grado di gestirli. Dal momento che non sto cercando di capire il modo migliore per utilizzare le transazioni in modo che le modifiche di cui sono responsabile non finiscano in una sorta di stato incoerente. – gr928x