Merhabalar bu makalede SQL tarafında TRANSACTION işlemi nasıl gerçekleştirilir bundan bahsetmek istedim.Öncelikle Transaction nedir? Ne işe yarar? Neden kullanılmalıdır? Gibi soruları cevaplayalım isterim.
TRANSACTION Nedir?
Transaction’ın türkçe karşılığı işlem demektir.Veri tabanımıza yaptığımız her insert,update,delete gibi işler aslında transaction’dur.
TRANSACTION Ne İşe Yarar?
Transaction adı üstünde işlemdir.Peki biz zaten normalde insert,delete vb. işleri yaparken transaction yapmış oluyorsak neden Transaction bloğunu kullanalım.
Transaction’ı ard arda yapacağımız işlemlerde kullanırız.Yani birbiri ile ilişkili işlemlerde kullanırız.
Nasıl mı?
Mesela veri tabanımızda Urun,UrunFiyat ve IslemLog adında üç tane tablomuz olsun.
Urun tablomuza bir ürün eklediğimizde otomatik olarak UrunFiyat tablomuza eklediğimiz ürünün Id’si ile bir insert yapıyor olalım.
Bu iki işlem yapıldığında da IslemLog tablomuza gerekli loglamamızı yapıyor olalım.
Yani işlem sıramız şu şekilde olsun;
1- Urun tablosuna ürün eklenecek
2- IslemLog tablosuna,Urun tablosuna eklenen ürün ile ilgili log atılacak.
3- Urun tablosuna eklenen ürünün Idsi ile UrunFiyat tablosuna fiyat bilgisi eklenecek.
4- IslemLog tablosuna,UrunFiyat tablosuna eklenen fiyat ile ilgili log atılacak.
Diyelim ki Transaction yapısını kullanmadan yukarıdaki işlemleri gerçekliyoruz;
1- X adında bir ürünü Urun tablosuna ekledik.
2- IslemLog tablosuna log atılırken hata oldu ve işlem kesildi.
Bu durumda yazmış olduğumuz seneryo yarıda kalmış oldu.Urun tablosunda X adında ürünümüz oluştu fakat UrunFiyat tablosunda o ürüne ait fiyat oluşamadı.
Ama Transaction yapısını kullanmış olsaydık hata almış olsak bile yapılan tüm işlemler geri alınacağı için Urun tablosundan X adındaki üründe kaldırılacaktı böylece işlem bölük pörçük olmayacaktı.
Transaction Yapısının Anahtar Kelimeleri Nelerdir?
Begin Transaction : Transaction’nu başlatır.
Commit Transaction : işlemler yapılırken bir hata ile karşılaşılmamış ise transaction’nu tamamlar.
Rollback Transaction : İşlemler yapılırken bir hata ile karşılaşılırsa yapılmış olan bütün işlemleri geri alır.
Gelin bu kadar anlatıma birde örnek ekliyelim anlaşılmasını ve kullanımını dahada pekiştirelim.
--Ürün bilgilerini tutmak için Urun tablomuzu oluşturuyoruz.
CREATE TABLE Urun
(
UrunId INT IDENTITY(1,1) NOT NULL,
UrunAdi NVARCHAR(50) NULL,
UrunKodu NVARCHAR(50) NULL,
AktifMi BIT NULL
)
--Ürün fiyat bilgilerini tutmak için UrunFiyat tablomuzu oluşturuyoruz.
CREATE TABLE UrunFiyat
(
UrunFiyatId INT IDENTITY(1,1) NOT NULL,
UrunId INT NULL,
Fiyat DECIMAL(16,2) NULL,
AktifMi BIT NULL
)
--Yapılan işlemlerin geçmişini(Loglarını) tutmak için IslemLog tablomuzu oluşturuyoruz.
CREATE TABLE IslemLog
(
IslemLogId INT IDENTITY(1,1) NOT NULL,
TabloAdi NVARCHAR(50) NULL,
IslemAciklama NVARCHAR(500) NULL,
AktifMi BIT NULL
)
--Ürün tablosuna ürün eklediğimizde son eklenen ürünün
--Id'sini(İndexini) tutacağımız değişkeni tanımlıyoruz.
DECLARE @pSonUrunIndex INT
--Try,Catch yapısını kullnanıyoruz çünkü TRY blogunda yapmak istediğimiz
--işlemleri gerçekleyeceğiz eğer bu işlemler sırasında bir hata almassak
--işlemlerimizi başarılı bir şekilde tamamlayacağız(Commit edeceğiz).
--Eğer bir hata ile karşılaşırsak CATCH bloğuna düşeceğiz ve yapılan
--işlemlerin hepsini geri alacağız(RollBack edeceğiz).
BEGIN TRY
--Transactionu başlatıyoruz.
BEGIN TRANSACTION
--Ürün tablosuna bir ürün ekliyoruz
INSERT Urun
VALUES ('Gofret','GFRT',1)
--Eklenen ürünün Id'sini tanımlamış olduğumuz değişkene atıyoruz.
SET @pSonUrunIndex = (SELECT @@IDENTITY)
--Yaptığımız işlemi logluyoruz.
INSERT IslemLog
VALUES ('Urun','Sisteme Ürün eklendi',1)
--Eklediğimiz ürünün fiyatını belirlemek için
--UrunFiyat tablosuna UrunId ile insert ediyoruz
INSERT UrunFiyat
VALUES (@pSonUrunIndex,1.25,1)
--Yaptığımız işlemi logluyoruz.
INSERT IslemLog
VALUES ('UrunFiyat','Gofret ürününe fiyat bilgisi eklendi',1)
--Yapılan işlemlerde sorun olmadan tamamlanırsa
--Transactionu başarılı sonlandırıyoruz
COMMIT TRANSACTION
END TRY
BEGIN CATCH
--Yapılan işlemleri geri çekiyoruz
ROLLBACK TRANSACTION
END CATCH
--Urun,UrunFiyat ve IslemLog tablolarımıza kayıtlar başarı ile
--yazılmışmı diye kotrol ediyoruz
SELECT * FROM Urun
SELECT * FROM UrunFiyat
SELECT * FROM IslemLog
--Tablolarımızı veri tabanımızdan kaldırıyoruz.
--Bu işlemi tabiki test oldupu için gerçekledik.
--Gerçek ortamda tablolarımız yerinde kalacak.
DROP TABLE Urun
DROP TABLE UrunFiyat
DROP TABLE IslemLog
Umarım yararlı olmuştur.
Bir sonraki makalede görüşmek üzere,
İyi günler dilerim.