SQL Server Tablo Kilit | MsSql

SQL Server’da Eşzamanlı Firma Kodu Üretimi – Güvenli ve Çakışmasız Yöntem

Merhaba, bir uygulama geliştirirken, Firma tablosuna yeni bir kayıt eklerken belirli bir kurala göre özel bir kod üretmem gerekti. Bu kod, otomatik artan bir ID değil; 3 haneli, sıralı bir string olmalıydı: 001, 002, 003 gibi.

Problem: Aynı Anda Birden Fazla Kayıt

İlk başta, MAX(FirmaKodu) alıp 1 artırarak yeni kodu üretmek bana mantıklı geldi. Ancak düşündüğümde, aynı anda birden fazla işlem çalışırsa aynı kodun iki farklı işlem tarafından alınması riski ortaya çıkıyordu. Bu da veri bütünlüğü açısından ciddi bir problem.

Çözüm: TABLOCKX + HOLDLOCK ile Transaction Kullanmak

SQL Server’da, tabloyu kilitleyerek bu çakışmayı önlemek mümkün. Aşağıdaki kod örneğinde, TABLOCKX ve HOLDLOCK kullanılarak, tüm tablo yazma amaçlı kilitleniyor ve bu sayede eşzamanlı işlemler birbirini bekliyor.

BEGIN TRANSACTION;
	SELECT @MaxKodu = MAX(CAST(FirmaKodu AS INT))
	FROM Firma WITH (TABLOCKX, HOLDLOCK);
	
	SET @MaxKodu = ISNULL(@MaxKodu, 0) + 1;
	SET @YeniFirmaKodu = RIGHT('000' + CAST(@MaxKodu AS VARCHAR), 3);

	-- Burada yeni firma kaydı yapılabilir
	-- INSERT INTO Firma (FirmaKodu, FirmaAdi, ...) VALUES (@YeniFirmaKodu, ...)

COMMIT TRANSACTION;
Açıklama:
  • TABLOCKX: Tüm tabloyu yazma amaçlı kilitler.
  • HOLDLOCK: Transaction bitene kadar diğer işlemleri bekletir, okuma yapanlar bile bekler.
  • ISNULL: Eğer tabloda hiç kayıt yoksa 0 alınıp 1 ile başlanır.
  • RIGHT('000' + ...): Kodun her zaman 3 haneli olmasını sağlar (001, 023, 115 vs.)
Neden Otomatik Artan ID Kullanmadım?

Çünkü uygulamanın iş mantığında, kodlar görsel olarak anlam taşıyor ve dış dünyaya gösteriliyor. Bu yüzden sade ve sıralı bir format tercih ettim.

Selamlar.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top