none
Transaction içinde lost update gerçekleşiyor, isolation level repeatable read ya da serializable olmuş farketmiyor RRS feed

  • Soru

  • Konuyu anlatmak için, bir örnek vermek istiyorum.

    Önce aşağıdaki kod ile tablo oluşturup, 2 satır kayıt insert edelim.

    CREATE TABLE [dbo].[AATest](
    	[ID] [int] NOT NULL,
    	[stok] [int] NULL,
     CONSTRAINT [PK_AATest] PRIMARY KEY CLUSTERED 
    (
    	[ID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    
    
    insert into [dbo].[AATest] (ID,stok)
    values (1,10),(2,20)

    Daha sonra , aşağıda kodu verilen, iki transaction'ı çalıştırcaz, önce tran1'i , 1-2 saniye sonra tran2'yi çalıştıracağız.

    Tran1:

      set transaction isolation level repeatable read
    
      begin transaction
    
      declare @count int
    
      Select top 1 @count=stok from [dbo].[AATest] with(holdlock,xlock)
      where ID=1
    
      WAITFOR DELAY '00:00:10';
    
      update [dbo].[AATest] set stok=@count-2 where ID=1
    
      
    
      commit transaction

    Tran2:

      begin transaction
    
      declare @count int
    
      Select top 1 @count=stok from [dbo].[AATest] 
      where ID=1
    
    
      update [dbo].[AATest] set stok=@count-7 where ID=1
    
    
      commit transaction

    Sorun şu, ID si 1 olan kayıtta stok=10 dur.

    --Önce tran1 i çalıştırıyoruz,  tran1 , stok değişkenini @count değişkenine atıyor,10 saniye sonra da, ID si 1 olan kaydın stok değerini @count-2 yapıyor

    --Daha sonra, tran1 den 1-2 saniye sonra, tran2 yi çalıştırıyorum. O da benzer yöntemle, ID si 1 olan kaydın stok değerini, @count-7 yapıyor.

    Beklentim şu, tran1 stok=10-2=8 yaptı, daha sonra tran2 stok=8-7=1 yaptı. Ama bu olmuyor.

    Oysaki tran1  isolation level'ı repeateble read, hem de içindeki select'e holdlock ve xlock koydum. tran1 isolation level, serializable olsa da sonuç farketmiyor.

    Gerçekleşen; iki transaction da , @count değişkenine 10 değerine atıyor. o yüzden tran1 'in yaptığı update kayboluyor.

    repeateble read isolation level'ın amacı bunu önlemek değil mi?



    17 Ocak 2020 Cuma 07:44