Bugün Transaction Boundary ve Rollback kavramlarını ele alacağız.
Transaction Boundary Nedir?
Transaction Boundary, bir işlemin nerede başladığını ve nerede bittiğini belirleyen sınırdır. Yani bir business operasyonunun tek bir mantıksal bütün olarak çalışmasını sağlar.
Amaç: İşlemin ya tamamen başarılı olması ya da hiç gerçekleşmemesidir.
Transaction Adımları
-
Begin (Başlat) İşlem başlatılır ve değişiklikler geçici alanda tutulur.
-
Commit (Başarılı Son) Tüm adımlar başarılıysa değişiklikler kalıcı hale getirilir.
-
Rollback (Başarısız Son) Herhangi bir hata oluşursa o ana kadar yapılan tüm değişiklikler geri alınır.
ACID Özellikleri
Transaction boundary, veritabanının ACID prensiplerini korumak için tasarlanmıştır:
- Atomicity: İşlem ya tamamen olur ya hiç olmaz.
- Consistency: İşlem sonrası veri kurallara uygun kalır.
- Isolation: İşlemler birbirini bozmaz.
- Durability: Commit edilen veri sistem çökse bile korunur.
SQL’de:
BEGINCOMMITROLLBACK
komutları ile transaction yönetilir.
Try–Catch Kullanımı
Transaction kullanırken mutlaka hata yönetimi yapılmalıdır:
try {
await transaction.commit();
} catch (error) {
await transaction.rollback();
}
Eğer hata yönetimi yapılmazsa sistem yarım kalmış veri üretebilir.
Örnek Senaryo (Para Transferi)
- A hesabından 100 TL düş
- B hesabına 100 TL ekle
- İşlem kaydı oluştur
- Commit
Eğer herhangi bir adımda hata oluşursa → Rollback
Bu sayede:
- Para düşüp karşı hesaba eklenmemesi gibi tutarsızlıklar engellenir.
Transaction Hangi Katmanda Olmalı?
Transaction işlemleri genellikle service katmanında yapılmalıdır.
Çünkü:
- Birden fazla repository çağrısı olabilir
- Tüm business adımlar tek bir sınır içinde kalmalıdır
⚠ Transaction sınırını gereğinden geniş tutmak performans sorunlarına yol açabilir.
MongoDB ve Transaction
MongoDB’de:
- Tek document içindeki işlemler zaten atomiktir.
- Birden fazla collection söz konusuysa transaction gerekir.
Örnek:
const result = await Product.findOneAndUpdate(
{
_id: productId,
stock: { $gte: quantity }
},
{
$inc: { stock: -quantity },
$push: { salesHistory: { userId, quantity, date: new Date() } }
},
{ new: true }
);
if (!result) {
throw new Error("Stok yetersiz veya ürün bulunamadı!");
}
Eğer order bilgisi tek bir document içinde tutuluyorsa transaction gereksinimi düşüktür. Ancak ayrı collection’lar varsa transaction gerekir.
SQL’de Transaction Gereksinimi
SQL’de veri genellikle normalize edilmiştir ve farklı tablolara dağılmıştır:
- Users
- Products
- Orders
Bir sipariş için:
- Stoğu düşmeliyiz
- Order eklemeliyiz
- Kullanıcı kaydını ilişkilendirmeliyiz
Bu nedenle SQL’de transaction kullanımı zorunludur.
Constraint ile Güvenlik
Bazı kuralları DB seviyesine taşıyabiliriz:
ALTER TABLE accounts
ADD CONSTRAINT bakiye_kontrol CHECK (balance >= 0);
Bu sayede uygulama hatalı update yapsa bile veritabanı işlemi reddeder.
Transaction Olmazsa Ne Olur?
Örnek:
- Product ID yanlış girildi
- Order yine de oluşturuldu
- Stok düşüldü ama sipariş geçersiz
Bu durum sistemde veri tutarsızlığı yaratır.
Transaction eklendiğinde:
- Hatalı işlem → Rollback
- Sistem tutarlı kalır
- Transaction boundary, bir iş operasyonunun güvenli sınırıdır.
- SQL’de çok tablolı işlemlerde zorunludur.
- MongoDB’de tek document atomiktir, fakat çoklu collection senaryolarında gerekir.
- Her zaman
try-catchile commit/rollback kontrolü yapılmalıdır.