ProgramlamaSQL Geliştirici

Yuva hata yönetimi (Exception Handling) ve SQL'de gömülü prosedürlerde (Stored Procedures) işlemlerin geri alınması nasıl güvenilir bir şekilde uygulanır, özellikle iç içe (Nested) işlemler senaryosunda? Bu tür çözümlerin kısıtlamaları ve özellikleri nelerdir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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:

  • Hataları yakalamak için TRY/CATCH kullanımı.
  • İç içe işlemler için @@TRANCOUNT kontrolü.
  • SAVEPOINT (veya geri dönüş noktası kontrolü için kendi benzerleri).

Sorular

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.

Yaygın hatalar ve anti-paterler

  • @@TRANCOUNT kontrolü yok — aktif olmayan bir işlemi geri alma girişimi.
  • İç içe düzeylerde gereksiz COMMIT veya ROLLBACK.
  • Hata kaydı yaparken tüm ayrıntıların (numara, metin, parametreler) kaydedilmemesi.

Gerçek hayattan bir örnek

Olumsuz durum

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ı:

  • Basit kod

Eksileri:

  • Haliyle durumun tutarsızlığı
  • Hata sonrası belirsiz hatalar

Olumlu durum

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ı:

  • Tam bütünlük
  • Hata denetimi

Eksileri:

  • Daha hacimli bir betik
  • Otomatik kaydetme mantığını sürdürmek biraz daha karmaşık.