SQL’de Transaction ve ACID kavramı Nedir ?

Furkan Alaybeg
4 min readFeb 25, 2020

--

Transaction, veritabanı işlemlerinde başarı ve hatayı garanti eden operasyonlar listesi olarak tanımlayabiliriz. Bu yazıda, SQL programlama dilinde Transaction yapısının ne olduğu, nerelerde kullanıldığını, ACID kavramını ve Transaction işlemlerini uygulamalı olarak anlatmaya çalışacağım.

Transaction konusuna geçmeden önce veritabanında ACID kavramından bahsetmede fayda olacağını düşünüyorum. ACID kavramı, elektrik kesintisi, sistem çökmesi gibi durumlarda geçerliliği garanti etmeye yarayan veritabanı özelliklerinin bir dizi özelliğidir. ACID özelliklerini karşılayan veritabanı işlemler dizisi, transaction olarak adlandırılır. Bir transaction özellikleri aşağıda verilmektedir.

* Atomic: Veritabanında gerçekleştirilen tüm işlemlerin (insert, update, delete gibi) başarıyla gerçekleştirilmesini (commit veya roll back edilmesini) garanti etmektedir.
* Consistent: Veritabanı tutarlılığını garanti almaktadır. Bir transaction’da commit veya roll back işlemi gerçekleştiğinde veritabanı tutarlığını korumak önemlidir. Bu nedenle transaction işlemleri başarılıysa tüm değişiklikler veri tabanına uygulanır. Eğer transaction ortasında hata gerçekleşirse, tüm değişiklikler otomatik olarak geri alınır.
* Isolation: Her transaction işlemi bireyseldir. Transaction tamamlanıncaya kadar, bir transaction diğer transaction’ların sonucuna erişemez. Bir transaction oturumu başladığında veriyi değiştirecek Insert, Update gibi ifadeler, sadece geçerli oturumda görünür.
* Durable: Bir transaction başarı ile tamamlandığında (commit gerçekleştiğinde), elektrik kesintisi veya program çökmesi durumunda değişiklikler veritabanında kalıcı olmalıdır.

Transactions birçok işletmede ve özellikle veri bütünlüğü anlamında önemli rol oynamaktadır. Uygulamalarda başarı veya hatayı garanti eden operasyonlar listesi olarak tanımlayabiliriz. SQL kodumuzda herhangi bir hata meydana geldiğinde işlemleri geriye alarak güvenli bir duruma getirmeyi sağlar. Günlük olarak kullandığımız ATM’de para çekme esnasında ister yazılımsal isterse donanımsal bir hata oluştuğunda paramızın hesabımızdan çekilmediğini görürüz. İşte bu gibi durumlarda Transaction yapısı devreye girerek paramızın hesabımıza geri dönmesini sağlar. Veritabanında gerçekleşecek olan işlemleri toplu olarak değerlendirip, herhangi bir işlemde hata olması durumunda, tüm süreci geri alıp başlangıç durumuna getirir. Böylece kritik işlemlerde veri bütünlüğünü garanti altına almış oluruz.

  • Bir transaction ilk olarak çalıştırılabilir bir SQL ifadesiyle başlar, COMMIT veya ROLLBACK işlemlerinden biri gerçekleşince tamamlanır.
  • Bir transaction başladığında, işlem yapılacak tablolar başka sorgular içinde kullanılmaması için ilgili transaction bitene MsSQL tarafından otomatik olarak kilitlenir.
  • Transaction süresince işlem başarılı bir şekilde gerçekleşirse COMMIT ile veritabanında kalıcı bir şekilde kaydedilir.
  • Transaction süresince herhangi bir nedenden dolayı işlem başarısız olursa ROLLBACK ile tüm süreç geri alınır.

Ne zaman Kullanılır

  • Kritik işlelerde verinin güvenli bir şekilde veritabanına kaydedilmesi veya hata ile karşılaşıldığında sürecin geriye dönmesini istediğimiz durumlarda kullanılır. Örneğin ATM’den para çekerken arıza oluşması durumunda paramızın hesabımızdan çekilmemesini sağlamak.
  • Hem ilgili birden çok ilgili işlem için hem de veritabanını aynı anda güncelleyen birden çok kullanıcı için veri bütünlüğünü korumak için kullanılır. Veritabanı işlemlerinin atomic olmasını sağlar.
  • Bir tablo üzerinde değişiklik yapmak istediğimizde ve diğer tablolarda da tutarlılığı olmasını istediğimizde transaction yapısı kullanılır. Customer (Müşteri) ve Order (Sipariş) tabloları üzerinden örnek verecek olursak, Order tablosu Customer tablosuna bağlıdır. Bu durumda, müşteri silindiğinde onunla igili siparişlerinde silinmesi gerekmektedir. Eğer silinmezse müşterisiz sipariş şeklinde tutarsız veri kaydı oluşur. Bu gibi durumda transaction yapısı ile veri bütünlüğü sağlanır.

Transaction COMMIT ve ROLLBACK Kavramı

Transaction COMMIT ve ROLLBACK çalışma yapısı

COMMIT (Onaylama): Veritabanında Insert, Update, Delete gibi işlemler başarılı bir şekilde gerçekleştiğinde COMMIT komutu ile değişiklikler kaydedilir. Böylece Durable kavramına göre veritabanına kalıcı olarak kaydedilir.

ROLLBACK (Geri Dönüş): Veritabanında Insert, Update, Delete gibi işlemlerden birinin başarısız olması durumunda ROLLBACK komutu ile tüm sürecin geri alınması sağlanır.

Uygulamalı Örnekler

Bu kısımda Transaction yapısına ait örnekler MsSQL Server ortamında NORTHWIND veritabanı kullanılarak gerçekleştirilmektedir. Birinci örnek Order ve OrderDetails tabloları kullanırak gerçekleştirilirken, ikinci örnekte günlük kullandığımız banka para transfer örneği gerçekleştirilmiştir.

Bir transaction START TRANSACTION, BEGIN ve BEGIN WORK komutları ile başlayıp, daha sonra gereken SQL kodları yazılarak devam edilir. Son kısımda COMMIT (başarılı) ve ROLLBACK (başarısız) durumuna göre sonlandırılır. Şimdi aşağıda bununla ilgili örnekler yapmaya çalışalım.

1. Sipariş Transaction Oluşturma Örneği

Sipariş Transaction SQL Kodu

BEGIN TRANSACTION ile yeni bir transaction oluşturulması başlatılır. Daha sonra 1.kısımda Order tablosuna yeni bir şipariş eklenmesi ve 2. kısımda OrderDetails tablosuna sipariş detayı hakkında satın alınan ürünler ve miktar gibi bilgiler eklenir. Eğer hem sipariş hem de ürün ve miktar bilgileri gereken tablolara başarı ile eklenirse COMMIT komutuyla veritabanında kalıcı olmak üzere kayıt edilir. Böylece bir transactionda bulunması gereken ACID kavramları sağlanarak Müşteri Siparişi başarıyla gerçekleştirilir. Ancak sipariş sırasında elektrik kesintisi, internet kesintisi veya sistem çökmesi gibi durumlar gerçekleşirse ROLLBACK ile sipariş geri alınıp gerçekleştirilmez.

2. Banka ATM Transaction Oluşturma Örneği

BankAccount Tablosunun Oluşturulması ve Veri Eklenmesi

Diğer bir örnek ise, günlük hayatta kullandığımız banka para transfer işlemidir. İlk olarak veritabanında, HesapNumara ve Bakiye değişkenlerini içeren BankAccount isminde bir tablo oluşturuyoruz. Devamında tabloya, INSERT INTO ile 3 farklı hesap numarası ve bakiye bilgisi eklenir. Artık transaction’ımızı oluşturabiliriz.

Banka Para Transfer Transaction SQL Kodu

Birinci örnekteki gibi transactionı oluştururken BEGIN TRANSACTION komutuyla başlıyoruz. Daha sonra kolaylık olması açısından para miktarı, gönderici ve alıcı değişkenlerini tanımlayıp değer ataması yapıyoruz. Daha sonra, gönderici hesabından para miktarını eksiltip, alıcıya eklenmesini sağlayan UPDATE kodunu yazıyoruz. Son kısımda, eğer para transfer işlemi gönderici ve alıcı arasında başarılı bir şekilde gerçekleşirse kalıcı olacak şekilde COMMIT ile veritabanına kaydedilir. Ancak, işlem sırasında yukarda bahsettiğimiz sistem hatası, elektrik kesintisi gibi durumlar gerçekleşirse ROLLBACK ile sürec geri alınıp para transfer işlemi gerçekleştirilmez. Yukarıdaki resimde kırmızı daire ile görüldüğü gibi para transferi 123AABDF hesabından 2256DF hesabına 750 olarak başarıyla aktarılmıştır.

Umarım faydalı bir yazı olmuştur. Gelecek yazılarda görüşmek dileğiyle.
İyi Çalışmalar…

--

--

Furkan Alaybeg

Big Data Engineer | SQL | PySpark | Hadoop | Apache Airflow | Apache Flink