Transaction mimarisi, veri tabanlarının bence en önemli parçasını oluşturmaktadır. Yapılacak bir işin basamaklarında herhangi bir hata alındığında o hataya kadar yapılan işleri tamamen geri alabilir yada bizim belirlediğimiz düğüme geri dönebiliriz.
Temel olarak transactionlar aşağıdaki 4 özelliğe sahiptirler.
- Atomicity: Yapılan bir işlem birden fazla alt işlem içerebilir ve bu alt işlemlerden herhangi birisi hatalı sonuçlanırsa, tüm işlemler geri alınır.
- Consistency: Transaction sonrasında yani işlemler bittiğinde veri bütünlüğü sağlanmalıdır. Kategori tablosunda olmayan bir kategori için, ürünler tablosuna herhangi bir kayıt yapılmamalıdır.
- Isolation: Birden fazla transactionın aynı anda yada farklı zamanlarda çalışması durumunda birbirlerini etkilememesi gerekmektedir.
- Durability: Herhangi bir hata alındığında, sistemin tamamen ilk haline dönebilme yeteneğidir.
Autocommit Transaction Yapısı
Bütünleşik olan işler için uygun olmayan Sql Server’in varsayılan transaction yapısıdır. İki tane dml işlemi düşünelim bir tanesi hata almış olsa bile diğeri için işlem gerçekleşecektir yani sql server her iki işlem için ayrı ayrı transaction açmaktadır.
Implicit Transaction Yapısı
Sql server varsayılan olarak autocommit transaction yapısını kullanmaktadır. Eğer aşağıdaki sorguyu çalıştırıp implicit yapsına geçtiğinizde artık sql server sizden ya commit (işlemin başarılı olduğu) yada rada rollback (işlemin başarısız olduğunu) belirtmenizi bekleyecektir. Bu cümlecikleri yazmadığınız takdirde crud işlemlerinden gerçek anlamda reaksiyon alamayacaksınızdır. Ayrıca eğer rollback yada commit komutlarını eklemezsek açılan transaction kapanmayacak ve sisteme yük getirecektir.
SET IMPLICIT_TRANSACTIONS ON komutuyla bu transaction yapısına geçebilir ve SET IMPLICIT_TRANSACTIONS OFF komutuyla bu yapıyı kapatabilirsiniz.
Hatırlatma: Kısa bir dönem oracle ile de çalışmış biri olarak oracle ms sql serverdan farklı olarak varsayılan transaction yapısı olarak implicit transaction yapısını kullanmaktadır.
Explicit Transaction Yapısı
Sql server’da en çok kullanılan ve tavsiye edilen transaction yapısıdır. Bu yapıda transactionın ne zaman başlayacağına ve ne zaman sonlanacağı bizim tarafımızdan belirlenir. Hemen basit bir transaction yazımına geçelim.
Öncelikle belirtmem gereken ve bizim işimize çok yarayacak olan iki tane komut var;
@@ERROR : En son çalıştırılan sql ifadesi sonucunda eğer bir hata oluşursa bu hata numarasını tutar.Başarılı bir şekilde çalışmışsa değer ‘0’ dönecektir.
@@TRANCOUNT: Sql server üzerinde akitf olarak çalışan yani kapatılmayan transaction sayısını tutmaktadır.
use AdventureWorks2014 select count (*)firstcount from HumanResources.Department declare @error int begin TRANSACTION insert into HumanResources.Department(Name, GroupName) values ('Finanace','Banking') set @error =@@error --insert işlemi sırasında bir hata olduysa değişkenimize o hata numarasını set ediyoruz. if (@error <> 0) goto error_handler select count (*)secondcount from HumanResources.Department insert into HumanResources.Department(Name, GroupName) values ('Finanace','Banking') set @error =@@error --insert işlemi sırasında bir hata olduysa değişkenimize o hata numarasını set ediyoruz. if (@error <> 0) goto error_handler COMMIT TRANSACTION error_handler: if (@error <> 0) begin ROLLBACK TRANSACTION end select count (*) thirthcount from HumanResources.Department
Yukarıdaki transaction bloğunda ilgili tablomuza basit 2 tane dml işlemlerini kontrollü bir şekilde yapmaya çalıştık. Herhangi bir adımda hata aldığımız an bütün işlemler en başa dönecek ve sistemimiz eski ve ilk haline dönmüş olacaktır. Kod bloğunda transaction başlamadan, ilk insert ve transaction sonrasında kayıtlarımızın sayısını çeken sorgular yazdık. İlk işlemden sonra +1 artan kayıt sayımız ikinci insert işleminde hata alacağından eski sayısına geri dönmüş olacaktır.
Yazıyı bitirmeden;
SAVE TRANSACTION: Bizim yazdığımız blokta bu komutu kullanmadık, bu yüzden sistem en başına dönmüştür siz herhangi bir hata aldığında en başa dönmek yerine bu komutu yazdığınız yere kadar olan kısım sistemimizde kayıtlı olacaktır.
Keyifli çalışmalar.