SQL Server Transaction ve With Nolock

tarafından 16 Ocak 2011 tarihinde Microsoft kategorisine yazıldı.

Basitçe sorgumuzun dizilimi
select * from Customers WITH (NOLOCK)
Şeklinde kullanarak  “Customers”  tablosunda kilit oluşturmadan başka kullanıcılar tarafından da kayıt girilmesini, güncellemesini ve silmesini sağlayabiliriz. Bu yöntem avantaj sağlayabileceği gibi ciddi dezavantajlarda ortaya çıkartabilir. Örnek olarak bir tablo üzerinde Son 1 adet kalan ürüne aynı anda 2 kişi birden işlem yaptılar. Tablo kilitli olmadığı için ürün aynı anda işlem yapan 2 kişiye birden hata vermeden aktarıldı. Tabi ki  örneğimizi 2 kişi olarak verdik.Bu sayı çok daha fazla olabilir, bunun sonucunda ise ciddi karmaşıklıklar çıkabilir.Bu karmaşıklığı önlemek içinse  “TRANSACTION” kullanmamız gerekir.
Transaction kullanımında işlemler sırasıyla gerçekleştirilmelidir.

  1. Sistemde istenilen ürün adedi kadar ürün kontrol edilir
  2. Ürün varsa Transaction başlatılır
  3. Mevcut üründen istenilen ürün adedi kadar düşülür
  4. Transaction tamamlanır
  5. Ürün yoksa İsteği reddet

Şimdi bunu SQL kodu olarak nasıl yapacağız bunu inceleyelim.
create procedure TRANSACTION
@UrunIstekAdet int,
@ProductID int

AS
BEGIN

Declare @MevcutUrun int
Declare @Result int
SET @MevcutUrun = (select UnitsInStock from Products Where ProductID=@ProductID)
if @UrunIstekAdet <= @MevcutUrun
BEGIN

BEGIN TRANSACTION
Update Products SET UnitsInStock =UnitsInStock @UrunIstekAdet Where ProductID = @ProductID
IF @@ERROR=0
BEGIN
COMMIT TRANSACTION
SET @Result=0
end else
BEGIN
ROLLBACK TRANSACTION
SET @Result = 1
end
end else
BEGIN
SET @result=2
END
RETURN @result
end
Yukarıdaki işlemleri sırasıyla inceleyelim.
@MevcutUrun  = Elimizde bulunan ürün sayısını alıyoruz.
SET @MevcutUrun = (select UnitsInStock from Products Where ProductID=@ProductID)
Kullanıcının seçtiği ürün ile “@MevcutUrun” eşleştriyoruz.
if @UrunIstekAdet <= @MevcutUrun
MevcutUrunulunan ürün sayısını alıyoruz.
Eğer kullanıcın seçtiği ürün “@MevcutUrun” Sayısından düşük yada eşitse işlem devam edecek aksi halde dönen “@Result” değeri 2 olacaktır.
image001
image002


image002

BEGIN TRANSACTION

Update Products SET UnitsInStock =UnitsInStock @UrunIstekAdet Where ProductID = @ProductID
Transaction başlattık ve seçilen üründen istenilen ürün adedi kadar düştük. “@Result” değeri 0 olacaktır.
COMMIT TRANSACTION
SET @Result=0
image003
Peki aynı anda ürünü isteyen olsaydı ne olacaktır.
ROLLBACK TRANSACTION
SET @Result = 1
Transaction yapılan işlemi geri alacak ve kullanıcıya ürün kalmadığını bildircektir.  “@Result” değeri 1TRANSEı önlemek içinse  “TRANSEalacak ve kullanıcıya ürün kalmadığını bildircekti.a olacaktır.
Böylece projelerimizin daha sağlıklı çalışmasını sağlayabiliriz. SQL TRANSACTION kullanımını basitçe bir örnekle anlatmaya çalıştım.
NOT=Projede Örnek veritabanı Northwind kullanılmıştır.

Bu yazı blog üzerinde Tayfun DEĞER tarafından paylaşılmıştır. 2009 yılında açılan blog kısa zaman içerisinde büyük bir izleyici kitlesine sahip olmuştur.Tayfun DEĞER danışmanlık ve eğitimler vermektedir. vExpert 2013-2015, VCP5, VCP5-DT, VCP-Cloud ve MCSE sertifikalarına sahiptir.Twitter 'dan @tayfundeger veya RSS ile sitedeki değişiklikleri takip edebilirsiniz.