|
Transaction Kavramı |
|
Gönderiliyor lütfen bekleyin... |
|
|
Transaction, özet olarak daha küçük parçalara
ayrılamayan işlem demektir. Özellike bir grup işlemin arka arkaya gerçekleşiyor
olmasına rağmen, seri işlemler halinde ele alınması gerktiğinde kullanılır.
Transaction bloğu içerisindeki işlemlerin tamamı gerçekleşinceye kadar hepsi
gerçekleşmemiş varsayılır.
Bir banka uygulamasını düşünün. Bir kullanıcı
başka bir kullanıcıya havale yaptığında ne olacağına bakalım. Öncelikle havale
yapanın hesap bilgilerinden havale yaptığı miktar düşülür. Ardından alıcının
hesabına bu miktar eklenir ve havale gerçekleşmiş olur. Ancak her zaman şartlar
istendiği gibi olmayabilir. Örneğin, gönderenin hesabından para düşüldüğü anda
elektrik kesilebilir ya da program takılabilir. Bu durumda, ne olur? Örneğin,
gönderenin hesabından para düşülmüştür ama alıcının hesabına da geçmemiştir yani
bir kısım paranın sahibinin kimliği kaybedilmiş olur. Bu da sistemin olası
durumlar dışında veri kaybetmeye müsait bir hal alması demektir. Bu durumun bir
şekilde önlenmesi gerekir.
Daha küçük parçalara ayrılamayan en küçük işlem
yığınına Transaction denir. Geçerli kabul edilmesi bir dize işlemlerin tamamının
yolunda gitmesine bağlı durumlarda transaction kullanılır. Transaction bloğu ya
hep ya hiç mantığı ile çalışır. Ya tüm işlemler düzgün olarak gerçekleşir ve
geçerli kabul edilir veya bir kısım işlemler yolunda gitse bile, blok sona
ermeden bir işlem bile yolunda gitmese hiçbir işlem olmamış kabul edilir.
SQL Server 3 farklı transaction desteği sağlar:
1. Harici(Explicit) Transaction: SQL Server’in
kullanıcı tarafından bir BEGIN TRAN ifadesi ile transaction’a başlatılması
şeklindeki bloktur. Bir aksilik olması halinde SQL Server tarafından veya
kullanıcı tarafından COMMIT ifadesi ile gerçekleşmiş olarak veya ROLLBACK
ifadesi ile hiç olmamış olarak sonlandırlabilir.
2.Dahili(Implict) Transaction: SQL Server’in
belli ifadelerden sonra otomatik olarak transaction açmasını sağlar. Bu modda,
bu belli ifadeler kullanıldıktan sonra, kullanıcı tarafından transaction’ın
sonlandırılması gerekir. Bu nedenle zahmetli bir mod’dur.
3.Auto Commit: Hiç bir transaction mod’u tayin
edilmedi ise, SQL Server bu modda çalışır. Auto Commit modunda iken, her bir
batch(yığın, Query Analyzer için 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. Batch
içerisinde bir sorun olursa, SQL Server otomatik olarak bütün batch’i geri
alır(ROLLBACK eder).
Ancak biz genel olarak transaction denilince,
harici transaction işlemlerini kastederiz. Harici transaction bloğunun
başlatılması ve gelişimini ele alacak olursak:
1.Transaction bloğu başlatılır. Böylece yapılan
işlemlerin geçersiz sayılabileceği VTYS’ye deklare edilmiş olur ve SQL Server
Auto Commit modundan çıkıp, Explicit moda geçer.
2.Transaction bloğu arasında yapılan her bir
işlem bittiği anda başarılı olup olmadığına gerek varsa, programcı tarafından
bakılıp, başarılı olmadığı anda geri alım işlemine geçilebilir(ROLLBACK).
Ancak bir sorun olması halinde, SQL Server tarafından da verilerin tutarlılığını
denetlemek üzere, transaction bloğunun başladığı andan itibaren bir güç
kesilmesi gibi durum ortaya çıkarsa, değişiklikler dikkate alınmayacak
şekildedir. Bu, transaction logları denilen yöntem ile yapılır. Bu yöntemde, bir
transaction başladıktan sonra, verileri tutan sayfalar diskten(HDD)
hafızaya(RAM) yüklenir ve ilgili değişiklikler, önce hafızada yapılır. Ardından,
değişikliklerin izdüşümü loglar diske yazdırılır, ardından veriler de
güncellenir.
3.Tüm işlemler tamamlandığı anda COMMIT ile
bilgiler yeni hali ile sabitlenir. Başarısız bir sonuç ise ROLLBACK ile en başa
alınır ve bilgiler ilk hali ile sabitlenir.
Bu örnek için aşağıdaki tabloyu kullanacağız:
Hesap tablosu
CREATE TABLE(
HesapNo CHAR(20) NOT NULL PRIMARY KEY,
Adi VARCHAR(55),
Soyadi VARCHAR(55),
Sube INTEGER,
Bakiye FLOAT
)
|
Genel Yapısı şu şekildedir:
1.Transaction başlatılır:
BEGIN TRAN[SACTION] [transaction_adi] |
İle bir transaction başlatılır.
Örnek:
DECLARE @havaleMiktar FLOAT
DECLARE @aliciHesap VARCHAR(20), @gonderenHesap
VARCHAR(20)
SET @aliciHesap=’1111122132113’
SET @gonderenHesap=’1111122132112’
SET @havaleMiktar=20000000
-- 20 milyon havale edilecek
BEGIN TRANSACTION
UPDATE tblHesap
SET bakiye=bakiye - 20000000
WHERE hesapNo=@gonderenHesap
UPDATE tblHesap
SET bakiye=bakiye + 20000000
WHERE hesapNo=@aliciHesap
|
2.İşlem başarılı olursa, COMMIT ile transaction
bitirilir. Başarısız olduğunun anlaşılması haline ROLLBACK komutu ile
transaction başarısız olarak bitirilebilir.(Yani en baştaki duruma geri dönülür)
Sabitleme noktaları:
Bazen, bir noktaya kadar gelindikten sonra,
işlemlerin buraya kadar olanını geçerli kabul etmek isteriz ama, bundan sonraki
işlemler için de transaction(geri alabilme seçeneği)ne ihtiyaç duyarız. Bu
türden durumlarda sabitleme noktalarından faydalanılır.
Bir sabitleme noktası başlatıldığı anda, en
başa dönme seçeneği saklı kalmak üzere, noktanın oluşturulduğu yere de dönme
seçeneği sunar
Genel yapısı şu şekildedir:
SAVE TRANSACTION sabitleme_notkasi_adi
|
Örnek:
BEGIN TRANSACTION
UPDATE tblHesap
SET bakiye = 5000000
WHERE hesapNo=’1’
SAVE TRANSACTION svp_kaydet
DELETE FROM tblHesap
WHERE HesapNo=’1’;
ROLLBACK TRAN svp_kaydet;
SELECT * FROM tblHesap;
ROLLBACK TRAN ;
SELECT * FROM tblHesap;
COMMIT
|
İPUCU:
Bir uygulamanın parçası olarak görev yapan
transaction’lar, gerçek uygulamalarda genellikle stored procedure’ler içerisinde
başlatılırlar. Bu durumda, bir hesaptan başka bir hesaba havale
işlemini gerçekleştirecek bir stored procedure , dışarıdan, üç parametre alır:
havale eden hesap numarası, havaleyi alacak hesap numarası ve havale miktarı.
RETURN parametresi ile de işlem başarılı ise 1, değil ise 0 döndürülebilir.
CREATE PROC SP$havale(@aliciHesap
CHAR(10),@gonderenHesap CHAR(10),@miktar MONEY)
AS
BEGIN TRANSACTION
UPDATE tblHesap
SET bakiye=bakiye - 20000000
WHERE hesapNo=@gonderenHesap
IF @@ERROR<>0
ROLLBACK
RETURN 0
UPDATE tblHesap
SET bakiye=bakiye + 20000000
WHERE hesapNo=@aliciHesap
IF @@ERROR<>0
ROLLBACK
RETURN 0
COMMIT
RETURN 1
GO
|
Test etmek için,
DECLARE @sonuc TINYINT
EXEC @sonuc = SP$havale(’1111122132113’, ’1111122132112’ ,20000000)
|
Makale:
Transaction Kavramı ADO.NET ve SQL Yaşar Gözüdeli
|
|
|
-
-
Eklenen Son 10
-
Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
|
|