Anasayfa / Yazılım / SQL / Transaction Nedir, Nasıl Kullanılır?

Transaction Nedir, Nasıl Kullanılır?

Kısaca Transaction için SQL Server ortamında kullandığımız iş birimidir diyebiliriz. Çoğu zaman bir transaction yalnızca bir türde işlem yapar, yani sadece veri silme, veri güncelleme veya veri ekleme gibi tek türde işlem yapar. Ama bir transaction içinde birden fazla da işlem yapılabilir. Yine transaction içinde SELECT işlemleri de yapılabilmektedir. Peki bunlar bizim bildiğimiz şeyler, neden transaction çıktı ki birden dediğinizi duyar gibiyim.

Burada dikkat edilecek nokta, transaction var çünkü, transaction içinde yer alan tüm işlemler veritabanı server üzerinde yapılmak zorunda, aksi halde transaction içindeki işlemlerin tek bi adımı dahi başarısız olsa, tüm yapılan işlemler yapılmamış gibi eski haline döner. Peki bunun yararı nedir?

Şimdi çok klasik olacak ama tabiri caizse cuk diye oturan bir örnek olduğu için 🙂 ATM örneğini vermek istiyorum bende. Bir kullanıcı olarak ATM’ye gittiniz diyelim, yapmak istediğiniz işlem para çekmek olsun. Kartınızı taktınız, şifrenizi girdiniz, para çekmeyi seçtiniz, miktarı belirlediniz ve çekmek istiyorum dediniz. ATM arka planda tüm bu işlemleri yaptı, çekmek istediğiniz para miktarını kontrol etti, paranın var olduğunu gördü, paranızı size vermek üzere para çekilecek alana yansıttı. Kartınızı da daha önceden verdi (artık genelde önce kart, sonra para veriliyor çünkü, parayı unutma ihtimali daha az mantığı ile bakılıyor olaya) Bu esnada arka planda hesabınızdan bu miktar düştü. Para şimdi parayı alacağınız alanda ama olduki dalgınlık oldu, hemen alamadınız bir kaç saniye geçti ve bankamatikte güvenlik icabı bu parayı geri aldı. Yani parayı hesaptan çektiniz ama elinize alamadınız para geri gitti 🙂 eee ne olacak şimdi, benim hesabımdaki para azalacak mı? Ben parayı almadım ki daha 🙂

İşte burada Transaction işleminin önemi devreye giriyor. Kullanıcı parasını alamadığı için Transaction sonlanmamış olur ve her şeyi eski haline geri çevirir. Yani çekilen miktar tekrar kullanıcının hesabına geri döner. Transaction işleminin önemi budur. Aynı durumu bankaya para yatıran bir şahıs içinde düşenebilirsiniz. Banka önce yatırılacak miktarı sorar, sonra kullanıcıdan parayı ister, tüm işlemler sonlandığında yani en son onay alındığında işlem aslında tamamlanmış olur.

Şimdi bir transaction nasıl oluşturulur buna değinelim. Bir transaction içinde yer alan tablolar ile alakalı işlem yapılırken kullanılan bu tablolar başka sorgular içinde kullanılmasın diye ilgili transaction çalışması bitene kadar kilitlenirler. SQL Server otomatik olarak bu işi yapar. Bir transaction oluşturmak için söz dizimi aşağıdaki gibidir. TRAN veya TRANSACTION her iki ifade de kullanılabilir.

BEGIN TRAN veya TRANSACTION
durum1
durum2
COMMIT TRAN veya TRANSACTION

Şimdi örnekle konuyu pekiştirelim. AdventureWorks2012 veri tabanı üzerinde çalışıyorum. Öncelikle aşağıdaki sorguyu yeni bir Query penceresinde çalıştırın. Varsa ilgili tabloyu silsin ve yeniden oluştursun.

IF EXISTS (SELECT * FROM sys.objects 
WHERE object_id = OBJECT_ID(N'[dbo].[demoTransaction]') AND type in (N'U'))
DROP TABLE [dbo].[demoTransaction];
GO
CREATE TABLE dbo.demoTransaction (col1 INT NOT NULL);
GO

Sorgum sonucunda Command(s) completed successfully. mesajını alırız.

Şimdi Transaction oluşturabiliriz.

BEGIN TRANSACTION
INSERT INTO dbo.demoTransaction (col1) VALUES (1);
INSERT INTO dbo.demoTransaction (col1) VALUES (2);
COMMIT TRANSACTION

Şimdi ben bu transaction ile dbo.demoTransaction tablosunda col1 kolonuna 1 ve 2 değerlerini atıyorum. Bir bakalım olmuş mu?

SELECT col1 FROM dbo.demoTransaction;

2013051113

Görüleceği üzere transaction içinde yer alan iki adet veri kaydetme işlemi gerçekleştirilmiş durumda.

Bir başka transaction yazalım.

BEGIN TRANSACTION
INSERT INTO dbo.demoTransaction (col1) VALUES (3);
INSERT INTO dbo.demoTransaction (col1) VALUES ('a');
COMMIT TRANSACTION 

Bu sorgu sonucunda aşağıdaki gibi bir mesaj alırız.

(1 row(s) affected)
Msg 245, Level 16, State 1, Line 3
Conversion failed when converting the varchar value ‘a’ to data type int.

Burada ise diyor ki, 1 satır eklendi, diğeri olmadı çünkü a değeri int tipinde bir değişken değil. Yani mesaja göre 3 değerini de eklenmiş olması gerek. Benim tablomda col1 alanı için int tipinde değişken olması gerekiyor, çünkü tbalomu oluştururken üstte de görüleceği üzere şartım bu. Ama 3 eklendi diyor bu mesajda. Bir bakalım cidden eklenmiş mi?

SELECT col1 FROM dbo.demoTransaction;

2013051113

Eee hani eklenmişti, (1 row(s) affected) dedi ama bana 🙂 Şimdi biz yazımızın üstte en başlarına doğru ne dedik. Bir Transaction içindeki her işlem adımının gerçekleşmesi gerekir, adımlardan herhangi birinde dahi bir hata meydana gelse ilgili transaction içindeki tüm adımlar, diğerleri gerçekleşmiş olsa dahi iptal edilir, eski haline döner. İşte buradaki durumda bu, 3 değeri tamam uygun ancak a uymuyor, yalnız bu iki işlem adımı da tek bir transaction içinde. Dolayısı ile bu ikinci yazılan transaction çalışmıyor.

9 yorum

  1. Tesekkurler cok guzel anlatmissiniz.

  2. Teşekkürler.

  3. Guzel bir anlatim tesekkurler

  4. Yeni öğrenen biri için oldukça net bir anlatım… teşekkürler…

  5. elinize sağlık çok güzel anlatmışsınız

  6. bizim hoca dan daha güzel anlatmışsın

  7. Bravo elinize sağlık

  8. Sitenizden tanıtım yazısı yazdırmak istiyorum iletişim kurabilir misiniz.

  9. Güzel anlatım teşekkürler

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir