Daha fazla TSQL öğrenen bir C# geliştiricisiyim. Böyle bir senaryo yazdım:Bir hareket denemesi gerektiriyor mu?
begin transaction
--Insert into several tables
end transaction
Ama bunun iyi bir fikir değildi ve böyle bir şey kullanmak söylendi:
BEGIN TRANSACTION;
BEGIN TRY
-- Generate a constraint violation error.
DELETE FROM Production.Product
WHERE ProductID = 980;
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage;
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
END CATCH;
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
GO
ikinci örnek daha doğru olduğunu neden görmüyorum . Birincisi aynı şekilde çalışmıyor mu? İlk olarak tüm tabloları güncelleyecek ya da hiç olmayacak gibi görünüyor mu? İşlemden önce neden @@TRANCOUNT
numaralı telefonu kontrol etmenin gerekli olmadığını anlamıyorum.
Seninle aynı argümanı yapar. Ek olarak size önerilen try/catch kalıbı, try/squelch dediğim bir anti-pattern'tir. Yakalar ve hata yapar ve sessizce ilerler. Bu hatalarla uğraşmıyor, onları bastırıyor. Bir işlem için try/catch bloğu gerekli değildir. Özellikle büyük olasılıkla her zamankinden çözecek çok daha fazla sorunlara neden olur bir try/catch kullanarak, bir tetikleyici olup olmadığını. –
İkinci örnekte herhangi bir şey varsa, bu işlem, catchtan sonra değil, try bloğunun içinde olmalıdır ... sanırım – Kritner