Tarihsel olarak, SQL'de hata yönetimi genellikle kritik bir hata sonrası işlemin geri alınmasıyla sınırlı olmuştur. Ancak iş mantığının gelişmesiyle birlikte, hata kaydının tam olarak yapılması, yalnızca yapılan değişikliklerin geri alınması ve gömülü prosedür çağrılarının iç içe olabilmesi giderek daha fazla talep edilmektedir.
Sorun, tüm DBMS’lerin iç içe işlemleri tam olarak desteklememesidir (örneğin, MS SQL Server'da bu daha çok kayıt noktası SAVEPOINT seviyeleri gibidir, gerçek işlemler değil) ve hata durumlarındaki istisnaların gerekli temizlik yapılmadan uygulamayı kesebilmesidir. TRY/CATCH veya benzeri mekanizmalar kullanılmazsa.
Çözüm: TRY/CATCH yapıları (veya benzeri), iç içe işlemler için SAVEPOINT kullanın ve hatalar durumunda prosedürlerin davranışını ayarlayın (örneğin, SQL Server’da SET XACT_ABORT).
Kod örneği (MS SQL Server):
BEGIN TRY BEGIN TRANSACTION -- işlemler EXEC dbo.InnerProcedure COMMIT TRANSACTION END TRY BEGIN CATCH IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION -- hata kaydı INSERT INTO error_log VALUES (ERROR_NUMBER(), ERROR_MESSAGE(), GETDATE()) END CATCH
Anahtar özellikler:
dikkatli ol.
İç içe bir işlemin hatası meydana gelirse, tüm değişikliklerin gerçek geri alınması gerçekleşir mi?
Çoğu DBMS'de iç içe işlemler ayrı işlemler değil, geri dönüş noktaları (SAVEPOINT) olarak tanımlanır. Genel bir geri alma işlemi, başlangıç (dış) işlemiyle birlikte tüm değişiklikleri geri alır.
@@TRANCOUNT’ı kontrol etmeden ROLLBACK yaparsanız ne olur?
Bir hata meydana gelir — geri alınacak aktif bir işlem yok. Her zaman ROLLBACK’tan önce @@TRANCOUNT > 0 kontrol edin.
TRY/CATCH içinde tetikleyiciler ve imleçler çalışıyor mu?
Evet, ancak tetikleyicideki hatalar CATCH’a geçiş yapabilir ve tüm işlemi geri alabilir. Hata yönetimini hem prosedürün gövdesinde hem de çağrılan nesnelerde (prosedürler, tetikleyiciler) sağlamak gereklidir.
Birbirine bağlı birkaç prosedür, her biri TRY/CATCH olmadan BEGIN TRANSACTION / COMMIT kullanır, bir hata meydana geldiğinde verilerin bir kısmı değiştirilir, bir kısmı ise değiştirilmez.
Artıları:
Eksileri:
Tüm mantık TRY/CATCH içinde, iç içe prosedürler SAVEPOINT kullanır veya tek bir dış işlemi yönetir, tüm hatalar kaydedilir.
Artıları:
Eksileri: