Muazzez KONUKLU

Cuma, Şubat 02, 2007

Sql transaction





Transaction


Transaction, daha küçük parçalara ayrılamayan işlem demektir. Özellikle bir grup işlemin arka arkaya gerçekleşiyor olmasına rağmen, seri işlemler halinde ele alınması gerektiğ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ürsek. Bir kullanıcı başka bir kullanıcıya havale yaptığında ne olur. Ö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 almak icin aşağıdaki tabloyu kullanirsak:
Hesap tablosu


Genel Yapısı:


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.

BEGIN TRAN[SACTION] [transaction_adi]
ile bir transaction başlatılır.

Örnek:






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. İş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)

COMMIT

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.


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:









0 Comments:

Yorum Gönder

<< Home