Kaydetme sırasında okunan ve değiştirilen verilerin kilitlenmesi
Tamam gibi görünüyor, değil mi? Ancak değil, dikkat etmemiz gereken çok önemli bir nokta var.
Şimdi prosedürümüzün şeması şu şekildedir:
- İlk sorguyu Query adı ile gerçekleştiriyoruz. Sonuç olarak belgenin ürün gamı listesinden geçici tablo oluşturuyoruz.
- İkinci sorguyu Query2 adı ile gerçekleştiriyoruz. Sonuç olarak, belgenin tablosunda yer alan ürün gamı için maliyet ve bakiyeleri okuduk.
- Kayıt hareketlerini yazıyoruz (RegisterRecords.Write()).
- Üçüncü sorguyu Query3 adı ile gerçekleştiriyoruz. Bunu yaparak negatif bakiyeleri kontrol ediyoruz.
İkinci sorgunun yürütülmesinden prosedürün sonuna kadar, üzerinde çalıştığımız ürün gamı maliyet ve bakiyelerinin değişmediğinden ve diğer işlemlerin bu verileri okumasına dahi izin verilmediğinden emin olmamız gerektiğine dikkat edeim. Sistemin kendisi doğal olarak bu verilerdeki değişiklikleri engelleyecektir, ancak sadece hareketleri kaydettiğimiz noktadan itibaren.
Ancak aşağıdaki durum ortaya çıkabilir. İkinci sorguyu gerçekleştirirken, bazı malzemelerden 2 adet olduğunu okuyoruz. Ve malzemeyi silecek olan başka bir işlem (başka bir kullanıcı) da bu malzemeden 2 adet olduğunu okudu. Daha sonra hareketleri kaydettik ve sistem bu verileri bloke etti. Bir başka işlem de verileri serbest bırakmamızı bekliyor. Bir belge kaydettik, 2 parça malzemeyi yazdık ve verileri serbest bıraktık. Başka bir işlem de 2 parça malzemeyi kaydetmeye çalışıyor, ancak malzeme çoktan gitti!
Benzer bir durum madde 3 ile madde 4 arasında da ortaya çıkabilir ve denge kontrolünün doğru çalışmamasına neden olabilir.
Bu nedenle, bu tür çakışmaları önlemek için, ikinci sorgu yürütülmeden önce bakiyelerin diğer işlemler tarafından okunmasını engellememiz gerekir. Yani, değiştirmek üzere olduğumuz bir şeyi okumadan önce, biz değişikliklerimizi tamamlayana kadar (veya belgeyi kaydetmeyi reddedene kadar) diğer işlemlerin bu verileri okumasını yasaklamamız gerekir.