SQL

SQL Ders25- Transaction Kullanımı

Transaction örneğimizi Northwind veri tabanımızdan gerçekleştiriyor olacağız.

declare @hata int --Hata kodunu için değişken tanımlandı
  begin tran SilmeTran --Transaction başlatıldı
  
  delete from Categories where Categories.CategoryID=1 --Foreign key hatası yüzünden burada hata alacağız.
  
  set @hata=@@ERROR
  IF (@hata <> 0) GOTO hata
  commit tran
  
  hata:
  if(@hata<>0)
  begin
  rollback tran SilmeTran --Hata olduğu için buraya gelecek.
  
  print 'Hata var işlemleri geri aldım...'
  end

Bu transaction’ımızda foreign key hatası yüzünden tüm yapılan işlemler geri alınacaktır. Rollback transaction çalışacaktır.

Burada küçük bir ayrıntıya değinelim. Bir transaction açıldığı zaman, transaction scope içerisinde değişiklik gören kayıtlar var ise bu kayıtlar lock durumuna alınır. Aksini belirtmediğiniz sürece transaction bitene kadar başka bir kullanıcı bu kayıtlara ulaşamaz, okuyamaz ve üzerinde değişiklik yapamaz.

Eğer kaç tane transaction yarattığınızı öğrenmek istiyorsanız aşağıdaki kodu kullanabilirsiniz.

select @@TRANCOUNT

İç İçe Transactionlar(Nested Transactions)

Kimi zaman bir transaction bitmeden diğer bir transaction yaratma isteğimiz doğabilir. Bunlara da Nested Transaction denir.

begin tran tran1
delete from orders where OrderID=10248
begin tran tran2
delete from Orders where OrderID=10249
commit tran tran1

Burada görüldüğü gibi tran1 transaction’ı bitmeden tran2 transaction başlamış durumdadır. İçinde bulunan transaction’ları ya Rollback eder ya da Commit.

Save transaction

Bazı durumlarda kısmi Commit veya kısmi Rollback transaction yapmaya ihtiyacımız olabilir. Bu gibi durumlarda bu noktalara kadar işlem yapılır sonrasındaki değişikler bir sonraki Rollback ve Commit’e göre hareket eder.

Bir tane Orders tablomuza bir veri ekleyelim.

insert into Orders(ShipAddress) values ('Ankara Çankaya')

Şimdi Ankara Çankaya adresi tek olduğu için onun silinmesini istiyoruz. Diğer kaydın ise foreign key hatası yüzünden silinmediğini göreceğiz.

delete from orders where ShipAddress='Ankara Çankaya' --Bu kayıt silinecek
  
      save tran tran3KontrolNoktasi
      delete from orders where OrderID=10253 --Bu kayıt Silinmeyecek
      rollback tran tran3KontrolNoktasi
  
commit tran tran3

şimdi Orders tablomuzdaki ‘Ankara Çankaya’ isimli ShipAddress kolonu tek olduğu için silinmiş mi bakalım.

İşte bu kadar kolay. Dıştaki transaction için yeni eklediğimiz veri olduğu için foreign key hatası almadı ve sildi. Ama içteki foreign key hatasından dolayı kaldı. Sizlerde bu şekilde muhteşem işler başarabilirsiniz.

hakkımdaki her şeyi bu blogda bulabilirsin. Haydi sende bir göz gezdirmeye ne dersin?

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir