Transaction SQL'de önemli bir yere sahiptir. Gelin hep beraber ne işe yaradığını öğrenelim.
Transaction SQL'de önemli bir yere sahiptir. Gelin hep beraber ne işe yaradığını öğrenelim.
Toplu kayıt ekleneceği durumlarda, tüm kayıtların eklendiğine emin olmamız gerekir. Örnek: Taksitlendirme yapacağız, 12 taksit veya 15 taksit, taksit tablosuna eklenecek. ilk 5 ayın taksidi eklendikten sonra elektrik kesintisi veya herhangi bir sebeple oluşabilecek arızalardan dolayı 12 ayın veya 15. ayın taksidi eklenemeyebilir. Bu durumda transaction kullanılır.
Bazı işlemlerin ya tamamı yapılmalı ya da hiçbiri yapılmamalı. Örnek: Sınıfımız öğrencilerinden Ayşe bankadaki hesabından üniversiteyi kazanan arkadaşı Fatma'ya 50 YTL harçlık yollayacak. Önce Ayşe'nin hesabından 50 YTL çıkarılmalı. ardından Fatma'nın hesabına 50 YTL eklenmeli. Ayşe parayı gönderirken elektrik kesintisi, donanım sorunu, veri bütünlüğüne aykırı kayıt gibi bir arıza meydana gelirse Ayşe'nin hesabından 50 YTL çıkar Fatma nın hesabına 50 YTL eklenmezse işlem hatalı olur. Bu işlem için de transaction gereklidir.
SQL Server 3 farklı transaction vardır:
SQL Server’da kullanıcı tarafından Begin Transaction komutu ile oluşturulan transaction biçimidir.
Transaction komutları
BEGIN TRAN (ya da begin transaction)
Transaction ın başladığını belirtir. Bu satırdan sonra işlemler yapılır, hata oluşur ise rollback ile işlemler eski haline getirilir. Herhangi bir hata oluşmaz ise Commit ile yapılan değişiklikler veritabanına yansıtılır.
COMMIT TRAN (ya da commit transaction)
Transaction içerisinde yapılan işlemler veritabanına kaydedilerek, transaction bloğu sonlandırılır.
ROLLBACK TRAN
Transaction içerisinde yapılan işlemler iptal edilir.
Örnek:
declare @tranadi varchar(20)
set @tranadi = 'kodblogu'
begin transaction @tranadi;
delete from haber where id= 13
commit transaction @tranadi
Bu modda,kullanıcı begin transaction ile yeni bir transaction oluşturmaz. Transaction sistem tarafından otomatik olarak oluşturulur. Kullanıcı sadece, sistem tarafından oluşturan transaction'ı commit/rollback ile sonlandırır.
Aşağıdaki komutlardan biri çalıştırıldığında otomatik olarak transaction başlatılır.
ALTER TABLE | INSERT |
CREATE | OPEN |
DELETE | REVOKE |
DROP | SELECT |
FETCH | TRUNCATE TABLE |
GRANT | UPDATE |
(create triggerda işlemleri iptal etmek için sadece rollback yazıldığını hatırlayınız.)
Transaction'da commit/rollback komutuna denk gelindiğinde transaction sonlandırılarak yeni bir transaction bloğu otomatik olarak başlatılır. Bu işlem gizli transaction modundan çıkılana kadar tekrar edilir.
SET IMPLICIT_TRANSACTIONS ON komutu ile gizli transaction aktif hale getirilir. SET IMPLICIT_TRANSACTIONS OFF ile pasif hale getirilir. Herbir transaction bloğu için COMMIT TRANSACTION, COMMIT WORK, ROLLBACK TRANSACTION, ROLLBACK WORK komutları kullanılabilir.
create table gizlitran
(cola int primary key,
colb char (3) not null) ;
go
set implicit_transactions on ; -- gizli transaction u aktif yap
go
select * from gizlitran
-- insert komutundan dolayı 1. transaction bloğu başlatılıyor
insert into gizlitran values (1, 'aaa') ;
go
insert into gizlitran values (2, 'bbb') ;
go
-- rollback ile değişiklikler iptal ediliyor.
rollback transaction;
go
-- rollback ile transaction sonlandırıldıığından otomatik olarak 2. transaction bloğu başlatılıyor.
select count (*) from gizlitran;
go
insert into gizlitran values (3, 'ccc') ;
go
select * from gizlitran;
go
-- ikinci transaction bloğu kabul ediliyor
commit transaction;
go
set implicit_transactions off ; gizli transaction pasif yapılıyor.
go
SQL Server Veritabanı Yönetiminin varsayılan transaction ayarıdır. Herbir T-Sql komutu çalıştırıldığında hata olmazsa komut işlenir (commit), komutun çalışmasında herhangi bir hatayla karşılaşılırsa komut iptal edilir (rollback). Açık veya Gizli (Explicit veya Implicit) transactionlar kullanıldığında bu transaction biçimi ezilerek etkisiz hale getirilir. Açık transaction, begin transaction komutu ile başlatılana veya Gizli transaction modu aktif yapılana kadar autocommit modu geçerlidir. Açık transaction commit/rollback ile sonlandırıldığında veya gizli transaction pasif yapıldığında autocommit moduna geçilir.
Auto Commit modunda iken, her bir yığın (iki go arasındaki ifade veya bir defada çalıştırılan bütün SQL ifadeleri) bir transaction bloğu olarak ele alınır. Yığın içerisinde bir sorun olursa, SQL Server otomatik olarak yığındaki bütün komutları iptal eder (rollback).
Aşağıdaki örnekte derleme hatası (compile error) oluşacaktır.
GO
CREATE TABLE Test (sutuna INT PRIMARY KEY, sutunb CHAR (3) ) ;
GO
INSERT INTO Test VALUES (1, 'aaa');
INSERT INTO Test VALUES (2, 'bbb');
INSERT INTO Test VALUSE (3, 'ccc'); -- values yanlış yazıldığı için hata oluştu, yığında hiçbir komut çalıştırılmayacak
GO
SELECT * FROM Test; -- Sonuçta hiçbir kayıt görüntülenmez
GO
Aşağıdaki örnekte çalışma zamanı hatası (runtime error) oluşacaktır.
GO
CREATE TABLE Test (sutuna INT PRIMARY KEY, sutunb CHAR (3) ) ;
GO
INSERT INTO Test VALUES (1, 'aaa');
INSERT INTO Test VALUES (2, 'bbb');
INSERT INTO Test VALUES (1, 'ccc'); -- sutun a primary key olduğu için 1 den sadece 1 tane olur
GO
SELECT * FROM Test; -- 1. ve 2. satırlar kabul edilir. 3. satırda runtime hatası oluşur 3. satır eklenmez
GO
Bir transaction başlatıldığında sql server tüm işlemleri log cache adı verilen yere kaydeder. Bu cache içerisine yazılan değişiklikler düzenli aralıklarla sabit diske kaydedilir.Bu bilgilerin sabit diskte kaydedildiği dosya transaction log dosyasıdır. Transaction bloğu çalışırken bir problem oluştuğunda, Sql Server yapılan işlemleri rollback ile geri alabilmek için transaction log u kullanır. Transaction bloğu başarıyla sonlandığında log cache deki ve transaction logdaki tüm değişiklikler veritabanına kalıcı olarak kaydedilir.