Sorunu yanlış bir şekilde çözmeye çalıştığınızı düşünüyorum. İstediğiniz veritabanı tutarlılığını en üst düzeyde korumaktır. İki kişi aynı anda bir saklı yordam çalıştırırsa, veritabanı tutarlılığı ihlal edilebilir.
Çeşitli veritabanı tutarsızlıklarına karşı koruma sağlamak için SQL standardının dört işlem yalıtım düzeyi vardır:
- Temelde işlemlerin değerlerini kaybettiği, diğer işlemlerin kirli veri gördüğü RAKAMI OKUYUN . Bunu kullanma!
- OKU İŞLENEN işlemler sadece taahhüt verileri görmek nerede, ancak iki işlemler birbirlerinin ayak üzerinde adım atabilirsiniz tutarsızlıklar olabilir
- Bir tür tutarsızlığın, tekrarlanamayan okumanın çözüldüğü TEKRARLANABİLİR OKUYUN
- İşlemlerin yürütülmesinin, sonuçlarının yürütülmesinin sonuçlandığı sonuçlara yol açacağı bazı sanal düzenlerin varlığını garanti eden SERIALIZABLE
Bununla birlikte, SQL standardı bu veritabanı tutarsızlıkları için kilit tabanlı bir yaklaşıma sahiptir ve performans nedenlerinden dolayı birçok veritabanı temel olarak şu düzeylere sahip bir anlık görüntü yalıtımı tabanlı yaklaşım alır:
- Kilit tabanlı veritabanlarında olduğu gibi OKULULDUĞU OKUYUN
- SNAPSHOT ISOLATION burada veritabanı tüm verilerin anlık görüntüsünü görür ve başka bir işlemle güncellenmiş bir satırı güncellemeye çalışırsa iptal edilir, ancak gerçekleşebilecek bazı iyi bilinen anormallikler vardır
- Kilitleme tabanlı veritabanlarında olduğu gibi SERİLEŞTİRİLEBİLİR , ancak bu kez kilit alarak değil, serileştirme ihlali olmadığından ve böyle bir ihlal tespit edildiğinde bir işlemi iptal ederek farklı bir şekilde uygulanır.
Bu anlık görüntü yalıtımı tabanlı veritabanlarındaki işlem iptalleri endişe verici gelebilir, ancak daha sonra her bir veritabanı bir kilitlenme nedeniyle bir işlemi iptal edecektir, bu nedenle herhangi bir makul uygulamanın bir işlemi yeniden deneyebilmesi gerekir.
İstediğiniz SERİLEŞTİRİLEBİLİR izolasyon düzeyidir: birbiri ardına bağımsız olarak gerçekleştirilen işlemlerin iyi bir duruma yol açması durumunda, işlemlerin paralel yürütülmesinin de iyi bir duruma yol açmasını sağlar. Neyse ki, Michael Cahill doktora tezinde SERİLEŞTİRİLEBİLİR izolasyon seviyesinin, az çaba harcanan anlık görüntü izole veritabanları ile nasıl desteklenebileceğini keşfetti .
Anlık görüntü izole edilmiş bir veritabanında SERIALIZABLE yalıtım düzeyi kullanılıyorsa , iki kişi saklı yordamı aynı anda çalıştırmayı denerse ve birbirlerinin ayak parmaklarına basarlarsa, işlemlerden biri iptal edilir.
Şimdi, SQL Server gerçekten SERIALIZABLE yalıtım düzeyini destekliyor mu ( SERIALIZABLE anahtar sözcüğünün arkasındaki anlık görüntü yalıtımını maskelemek yerine )? Açıkçası, bilmiyorum: onu destekleyen bildiğim tek veritabanı PostgreSQL.
SQL Server'a özel tavsiyeler verememe rağmen, yine de bu yanıtı gönderiyorum, çünkü PostgreSQL kullanıcıları ve PostgreSQL'e geçmeyi düşünebilecek diğer veritabanlarının kullanıcıları benim cevabımdan yararlanabilir. Ayrıca, PostgreSQL'e geçemeyen PostgreSQL olmayan veritabanlarının kullanıcıları, orijinal SERIALIZABLE yalıtım seviyesi sunmak için en sevdikleri veritabanı satıcılarını zorlayabilir .