- Katılım
- 7 Nis 2025
- Konular
- 367
- Mesajlar
- 780
- Çözümler
- 1
- Tepkime puanı
- 121
- Puan
- 93
- Konum
- İstanbul
- Web sitesi
- forumagel.com
Gerçek dünya uygulamalarında, tek bir iş mantığı adımı genellikle birden fazla veritabanı işlemi (
Transaction (İşlem) Nedir?
Bir Transaction, veritabanı üzerinde gerçekleştirilen ve tek bir mantıksal iş birimi olarak ele alınan bir dizi işlemdir. Bu işlemler ya hep birlikte tamamlanır (commit edilir) ya da herhangi bir hata durumunda hiçbiri kalıcı hale gelmez ve geri alınır (rollback edilir). Yukarıdaki banka örneğinde, para transferi işlemi, gönderenden düşme ve alıcıya ekleme adımlarını içeren bir transaction içinde gerçekleştirilir. Eğer adımlardan biri başarısız olursa, tüm transaction geri alınır ve her iki hesap da başlangıçtaki durumuna döner.
ACID Prensipleri
İlişkisel veritabanı sistemleri, transactionların güvenilirliğini sağlamak için genellikle ACID adı verilen dört temel prensibi garanti eder:
SQL ile Transaction Yönetimi
Transactionları yönetmek için kullanılan temel SQL komutları şunlardır:
Uygulamalardan Transaction Yönetimi
Uygulama kodunda (Java, C#, Python vb.) transactionlar, kullanılan veritabanı sürücüsü veya ORM (Bölüm 21) aracılığıyla yönetilir. Genellikle şu adımlar izlenir:
İzolasyon prensibini sağlamak için farklı seviyeler tanımlanmıştır. Bu seviyeler, bir transaction'ın aynı anda çalışan diğer transaction'lardan ne kadar etkileneceğini belirler. Yaygın izolasyon seviyeleri (artan izolasyon/azalan eşzamanlılık sırasıyla): Read Uncommitted, Read Committed, Repeatable Read, Serializable.
Transactionlar ve ACID prensipleri, güvenilir ve tutarlı veritabanı uygulamaları geliştirmenin temelidir. Her veritabanı geliştiricisi ve yöneticisinin bu kavramları iyi anlaması çok önemlidir.
Bu bölümde veritabanı transactionlarının ne olduğunu, ACID prensiplerini ve SQL ile uygulama seviyesinde nasıl yönetildiğini ele aldık.
Veritabanı yönetiminin bir diğer önemli yönü, belirli görevleri zamanlanmış olarak otomatik çalıştırmaktır.
Bir sonraki ve serimizin bu aşamadaki son bölümünde, veritabanı içinde zamanlanmış görevleri yönetmek için kullanılan araçlara, yani Görev Zamanlayıcılarına (Job Schedulers - örneğin SQL Server Agent) göz atabiliriz.
INSERT
, UPDATE
, DELETE
) gerektirir. Örneğin, bir banka uygulamasında bir hesaptan diğerine para transferi yapmak hem gönderen hesaptan parayı düşürmeyi (UPDATE
işlemi) hem de alıcı hesaba parayı eklemeyi (UPDATE
işlemi) içerir. Eğer gönderen hesaptan para düşürüldükten sonra sistem çökerse ve alıcı hesaba eklenemezse, para kaybolmuş olur. Bu tür tutarsızlıkları önlemek için Transactionlar (İşlemler) kullanılır.Transaction (İşlem) Nedir?
Bir Transaction, veritabanı üzerinde gerçekleştirilen ve tek bir mantıksal iş birimi olarak ele alınan bir dizi işlemdir. Bu işlemler ya hep birlikte tamamlanır (commit edilir) ya da herhangi bir hata durumunda hiçbiri kalıcı hale gelmez ve geri alınır (rollback edilir). Yukarıdaki banka örneğinde, para transferi işlemi, gönderenden düşme ve alıcıya ekleme adımlarını içeren bir transaction içinde gerçekleştirilir. Eğer adımlardan biri başarısız olursa, tüm transaction geri alınır ve her iki hesap da başlangıçtaki durumuna döner.
ACID Prensipleri
İlişkisel veritabanı sistemleri, transactionların güvenilirliğini sağlamak için genellikle ACID adı verilen dört temel prensibi garanti eder:
- Atomicity (Bölünmezlik): Bir transaction içindeki tüm işlemler ya tamamen gerçekleşir ya da hiç gerçekleşmez. Yarım kalmış transaction durumu olmaz. Tıpkı bir atom gibi bölünemez bir bütündür.
- Consistency (Tutarlılık): Bir transaction başladığında veritabanı tutarlı bir durumdaysa, transaction tamamlandığında (commit edildiğinde) da veritabanı yine tutarlı bir durumda olmalıdır. Transaction, veritabanını bir geçerli durumdan başka bir geçerli duruma taşır. Kısıtlamaların (
CONSTRAINT
), tetikleyicilerin (TRIGGER
) ve diğer kuralların transaction sonunda hala geçerli olması gerekir. - Isolation (İzolasyon): Aynı anda çalışan birden fazla transaction, birbirini etkilemez. Her transaction, sanki veritabanında çalışan tek transaction kendisiymiş gibi davranır. Bu, transactionlar arası veri çakışmalarını (dirty reads, non-repeatable reads, phantom reads gibi) önlemeyi hedefler.
- Durability (Kalıcılık): Bir transaction başarıyla tamamlandığında (commit edildiğinde), yaptığı değişiklikler kalıcıdır ve sistem arızaları (güç kesintisi, çökme vb.) durumunda bile kaybolmaz. Değişiklikler disk gibi kalıcı bir depolama birimine yazılır.
SQL ile Transaction Yönetimi
Transactionları yönetmek için kullanılan temel SQL komutları şunlardır:
BEGIN TRANSACTION
(veyaSTART TRANSACTION
): Yeni bir transaction başlatır. Bu noktadan sonra yapılan veri değiştirme işlemleri (INSERT, UPDATE, DELETE), transaction tamamlanana kadar geçicidir.COMMIT
: Transaction içindeki tüm işlemleri onaylar ve kalıcı hale getirir. Değişiklikler veritabanına yazılır ve diğer kullanıcılar tarafından görülebilir hale gelir.ROLLBACK
: Transaction içindeki tüm işlemleri iptal eder ve veritabanını transaction başlamadan önceki durumuna geri döndürür. Yapılan değişiklikler silinir.
Kod:
-- Bir transaction başlatBEGIN TRANSACTION;
-- Birinci hesap bakiyesini düşürUPDATE HesaplarSET Bakiye = Bakiye - 100WHERE HesapNo = 'TR123';
-- İkinci hesap bakiyesini artırUPDATE HesaplarSET Bakiye = Bakiye + 100WHERE HesapNo = 'TR456';
-- Eğer her iki işlem de hatasız tamamlandıysa, transaction'ı onaylaCOMMIT;
-- Eğer işlemlerden biri hata verirse, tüm transaction'ı geri al (genellikle hata yakalama blokları içinde yapılır)-- ROLLBACK;
Uygulamalardan Transaction Yönetimi
Uygulama kodunda (Java, C#, Python vb.) transactionlar, kullanılan veritabanı sürücüsü veya ORM (Bölüm 21) aracılığıyla yönetilir. Genellikle şu adımlar izlenir:
- Veritabanı bağlantısı alınır.
- Bağlantı üzerinde otomatik commit modu kapatılır (eğer açıksa).
- Transaction başlatma komutu gönderilir veya sürücünün ilgili metodu çağrılır.
- Transaction içindeki SQL komutları çalıştırılır.
- Tüm komutlar başarılı olursa, commit komutu gönderilir veya sürücünün commit metodu çağrılır.
- Herhangi bir adımda hata oluşursa, rollback komutu gönderilir veya sürücünün rollback metodu çağrılır.
- Bağlantı kapatılır.
İzolasyon prensibini sağlamak için farklı seviyeler tanımlanmıştır. Bu seviyeler, bir transaction'ın aynı anda çalışan diğer transaction'lardan ne kadar etkileneceğini belirler. Yaygın izolasyon seviyeleri (artan izolasyon/azalan eşzamanlılık sırasıyla): Read Uncommitted, Read Committed, Repeatable Read, Serializable.
- Read Uncommitted: En düşük seviye. "Kirli okumalara" (dirty reads - henüz commit edilmemiş veriyi okuma) izin verir. En yüksek eşzamanlılık.
- Read Committed: Sadece commit edilmiş veriyi okur. Kirli okumaları engeller. Çoğu DBMS'in varsayılan seviyesidir.
- Repeatable Read: Aynı transaction içinde aynı veriyi tekrar okuduğunuzda aynı değeri alacağınızı garanti eder. "Tekrarlanamaz okumaları" (non-repeatable reads - aynı satırın değerinin değişmesi) engeller. "Hayalet okumalara" (phantom reads - sorgu sonuç kümesine yeni satırların eklenmesi) izin verebilir.
- Serializable: En yüksek izolasyon seviyesi. Transactionlar tamamen izole edilir; sanki tek tek çalışıyorlarmış gibi görünür. Tüm okuma ve yazma çakışmalarını engeller. En düşük eşzamanlılık; kilitleme (Bölüm 18) nedeniyle performans sorunlarına yol açabilir.
Transactionlar ve ACID prensipleri, güvenilir ve tutarlı veritabanı uygulamaları geliştirmenin temelidir. Her veritabanı geliştiricisi ve yöneticisinin bu kavramları iyi anlaması çok önemlidir.
Bu bölümde veritabanı transactionlarının ne olduğunu, ACID prensiplerini ve SQL ile uygulama seviyesinde nasıl yönetildiğini ele aldık.
Veritabanı yönetiminin bir diğer önemli yönü, belirli görevleri zamanlanmış olarak otomatik çalıştırmaktır.
Bir sonraki ve serimizin bu aşamadaki son bölümünde, veritabanı içinde zamanlanmış görevleri yönetmek için kullanılan araçlara, yani Görev Zamanlayıcılarına (Job Schedulers - örneğin SQL Server Agent) göz atabiliriz.