SQL - TRANSACTION ve ISOLATION LEVEL İpuçları
Bir Tablo düşünün. Bu tablo'dan belli bir koşula uyan satırları alıp bir işleme tabi tutmak ve sonrasında o satırlarda bir alanı bu işlemin yapıldığına dair güncelleyerek tekrar aynı satır(lar) için bu işlemin yapılmasını engellemek istiyorsunuz. Fakat aynı yazılımın başka bir kopyasını kullanan bir başka kullanıcında kopyalardan birinde başlayan bu işlemi tekrar etmemesi gerekiyor olsun.
Evet, Bunu SQL ISOLATION LEVEL ve Transaction kullanarak yapabilirsiniz fakat Transaction süreci UPDATE, DELETE, INSERT gibi veri manipülasyon işlemlerini diğer kopyalardan arındırmaya yarar, oysa sizin yukarıdaki senaryo'da ihtiyacınız olan SELECT ile işlem sürecine koşullayarak aldığınız satırlar için bir başka kopyanın yine SELECT ile aynı satırları çekerek süreci başlatmasını engellemek.
Tablomuz EvrakKutuk olsun, bu tablo'da mig alanı 0 olan satırları alıp başka bir sürece dahil edip akabinde bu satırların mig alanlarını güncelleyerek tekrar aynı satırlar için daha sonra işlem yapmayı engellemeyi planlamış olalım. Fakat bu işi yapacak olan uygulamanızın bir başka kopyasınında kullanılan kopya ile eş zamanlı aynı süreci başlatmasını engellemeniz gerekir.
Bunun için basitçe ISOLATION LEVEL READ COMMITTED modunda transaction içerisinde selectle koşullayıp çekeceğimiz satırlar için öncesinde mig alanını yine kendi taşıdığı data ile update ederek UPDATE komutunu koşullu kullandığımız bu transaction'ın commit olmasına kadar yani tüm süreç tamamlanıncaya kadar aynı uygulamanın bir başka kopyasının aynı koşulu taşıyan satıları select ile cekmesine engel olabiliriz.
Biraz karışık olmuş olabilir, ilerleyen günlerde bu konuya derinlemesine gireceğiz. :)
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
GO
BEGIN TRANSACTION
update EvrakKutuk set mig=mig where mig=0
select * from EvrakKutuk
......
......
......
......
COMMIT TRANSACTION