Transaction
Giriş Veritabanı sistemlerini yüzeysel kullanan geliştiriciler için çok basit gelen işlemler aslında mimari olarak geri planda bir çok iş sürecinin doğru yürütülmesiyle meydana gelmektedir. Bu iş süreçleri veritabanı motoru tarafından yönetilir. Ancak, depoladığımız veriyle ilgili işlemlerin bütünlüğü tamamen bize, yani geliştiriciye aittir.
Giriş Örneğin, birbiriyle ilişkili bir sorgu yapısı var ve biz bu kodların tamamının doğru çalışması halinde başarılı bir işlem gerçekleştirmiş olacak isek, bu durumda herhangi bir parça işlemin başarısız olması halinde diğer yapılan tüm işlemlerin geri alınması mantıklı olacaktır.
Transaction Bir veya daha fazla SQL ifadesinden meydana gelen tek bir işlemdir. SQL ifadelerin tamamı bir bütün olarak düşünülür ve daha küçük iş parçalarına ayrılamaz. Bir transaction içerdiği SQL ifadelerini tamamını gerçekleştirir veya hiçbirini gerçekleştirmez. İşlemlerin tamamı gerçekleşmediği sürece işlemlerin hiçbiri gerçekleşmemiş sayılır.
Şekilde görüldüğü gibi tüm işlemlerin gerçekleşip "commit" komutunun çalıştırılabilmesi için hepsinin başarılı olması gerekmektedir. Bir tanesi bile hatalı olduğunda "rollback" komutu çalışır ve gerçekleştirilmesi istenilen tüm işlemler iptal edilir.
Örnek Bir banka örneği ile transaction yapısını açıklayalım. Bir müşteri kendi hesabından başka bir hesaba 1500 TL para transferi yapıyor. Bu işlemin iki adımı vardır. İlk adım kişinin hesabından transfer edilcek para, ikinci adım ise diğer kişinin hesabına transfer edilecek olan tutarın eklenmesidir. Bu işlemleri gerçekleştircek SQL ifadeleri: update hesaplar set bakiye=bakiye-1500 where hesap_no=1453 update hesaplar set bakiye=bakiye+1500 where hesap_no=1454
Örnek(Devamı) Bu işlemlerden birincisi gerçekleştikten sonra herhangi bir sorundan dolayı ikinci işlem gerçekleşmezse hesapla ilgili ciddi sorunlar yaşanabilir. Bu tür sorunları engellemek için transaction yapıları kullanılır.Transaction her iki işlemide tek bir işlem olarak ele alacağı için herhangi birisi gerçekleşmediği zaman diğer gerçekleşen işlemleride yok sayacaktır. Yani gerçekleşen işlem geri alınacaktır(Bu işlem rollback olarak adlandırılır.). Eğer işlemlerin tamamı sorunsuz bir şekilde gerçekleşirse tüm işlemleri kalıcı hale getirecektir. (Bu işlem commit olarak adlandırılır. )
begin tran declare @bakiye int select @bakiye=Bakiye from banka where hesapno='001' update banka set Bakiye=Bakiye-1000 where hesapno='001' update banka set Bakiye=Bakiye+1000 where hesapno='002' if @bakiye>=1000 commit else rollback tran select * from banka
Transaction Transaction yapıları transaction logları adı verilen yöntemi kullanılır. Bu yöntemle bir transaction başladıktan sonra SQL ifadeleri için kullanılan verileri tutan sayfalar diskten hafızaya aktarılır ve SQL ifadesiyle istenilen değişiklikler hafıza üzerindeki bilgilerde yapılır. Daha sonra yapılan değişikliklerin aynısını içeren transaction logları diske yazılır. Transaction işlemi başarılı ise COMMIT ifadesi ile değişiklikler kalıcı hale getirilir. Eğer işlemler esnasında bir sorun olmuşsa ROLLBACK ifadesi ile veriler ilk baştaki değişiklik yapılmış haline geri döner.
Transaction hazırlanırken dikkat edilcek hususlar : Transaction içerisindeki SQL ifadeleri veriler üzerinde değişiklik yapabileceği için veritabanı yöneticisi kullanıcılar için gerekli izinleri vermelidir. Transaction işlemi veri veya veritabanı nesneleri üzerinde değişiklik yapacak SQL ifadeleri içerebilir. (INSERT, UPDATE, DELETE, CREATE, ALTER, DROP) Bir veritabanı yönetim sisteminin veri kurtarma mekanizması transaction'lara bağlıdır. Bir VTYS başarısızlık sonrasında verileri geri alacağı zaman tüm transaction'ların veritabanına aktarılıp aktarılmadığını tespit etmek için transaction loglarını kontrol eder.
Transaction hazırlanırken dikkat edilecek hususlar : VTYS yedekleme ve geri yükleme işlemlerini transaction logları üzerinden gerçekleştirir. Çeşitli nedenlerden dolayı veritabanını ve ona ait transaction logları ayrı bir disk üzerinden tutulmalıdır.
Transaction Başlatma ve Bitirme Transaction ya hep ya hiç mantığıyla çalıştığı için başlangıç ve bitiş noktaları belirlenmelidir. Transaction BEGIN TRANSACTION ifadesiyle başlar ve COMMIT veya ROLLBACK ifadesiyle son bulur.
Örnek: Kütüphane veritabanı içinde bulunan kitaplar tablosu için örnek bir transaction işlemi gerçekleştireceğiz. Update ifadesi kitapların tamamının sayfa sayısını sıfır(0) yapacaktır. Daha sonra SELECT ile tablonun son durumunu listeleyecektir. Sonraki slaytta her adımdan sonra tablodaki değişimler gösterilmiştir.
Örnek: begin transaction update kitaplar set s_sayisi=0 Tablonun ilk hali Örnek: ISBN Kitap_adi Yayin_tarihi S_sayisi 123 Algoritma 1.1.2010 300 312 Programlama 2.1.2010 200 begin transaction update kitaplar set s_sayisi=0 update kitaplar set kitap_adi='deneme' select * from kitaplar rollback ISBN Kitap_adi Yayin_tarihi S_sayisi 123 Algoritma 1.1.2010 312 Programlama 2.1.2010 ISBN Kitap_adi Yayin_tarihi S_sayisi 123 deneme 1.1.2010 300 312 2.1.2010 200 ISBN Kitap_adi Yayin_tarihi S_sayisi 123 Algoritma 1.1.2010 300 312 Programlama 2.1.2010 200
Save Transaction Uzun transaction işlemleri için transaction kendi içerisinde savepoint adı verilen küçük parçalara ayrılır. Her bir bölüm commit ile veritabanına aktarılabilir veya rollback ile işlem geri alınabilir. Kullanım şu şekildedir. Save transaction savepoint_ismi (sql cümleleri) Commit (yada) rollback transaction savepoint_ismi
Örnek : Kitaplar tablosu için aşağıda örnek bir transaction işlemi verilmiştir. Verilen kodlar içerisinde ROLLBACK ve ROLLBACK savepoint işlemlerine örnek teşkil etmektedir.
Örnek : Tablonun ilk hali ISBN Kitap_adi Yayin_tarihi S_sayisi 123 Algoritma 1.1.2010 300 312 Programlama 2.1.2010 200 begin transaction save transaction deneme update kitaplar set s_sayisi=0 select * from kitaplar rollback transaction deneme update kitaplar set kitap_adi='deneme' rollback ISBN Kitap_adi Yayin_tarihi S_sayisi 123 Algoritma 1.1.2010 312 Programlama 2.1.2010 ISBN Kitap_adi Yayin_tarihi S_sayisi 123 Algoritma 1.1.2010 300 312 Programlama 2.1.2010 200 ISBN Kitap_adi Yayin_tarihi S_sayisi 123 deneme 1.1.2010 300 312 2.1.2010 200 ISBN Kitap_adi Yayin_tarihi S_sayisi 123 Algoritma 1.1.2010 300 312 Programlama 2.1.2010 200
Örnek : Kodlar incelendiğinde transaction işlemi başladığında değişiklik yapılmamış durumu deneme noktası olarak oluşturulmuştur. Daha sonra kitapların sayfa sayısı sıfır yapılmıştır. Sonra rolback savepoint deneme komut satırı ile yapılan değişiklikler iptal edilmiş olup sayfa sayısı bilgisi ilk haline gelmiştir. Sonra kitap isimleri deneme olarak değiştirilmiştir. Sonra rollback satırı bu işlemde geri alınmıştır. Önceki slaytta her adımdan sonra tablodaki değişimler gösterilmiştir.