SQL Server’da Snapshot Isolation kullanmanın iki FARKLI yolu


Hiç kullanmamış olsanız bile, muhtemelen SQL Server 2005’te artık snapshot isolation kullanılabiliyor olduğunu duymuşsunuzdur. Tabii SQL Server üzerine çalışmalarınız varsa…

SQL Server 2005 sürümüne kadar kötümser eşzamanlılığı (pessimistic concurrency) kullanıyordu. Bu yaklaşımın temelindeki mantık, “bizde çok değişiklik olur, verini kilit altına al”dır.

2005’le birlikte iyimser eşzamanlılıkla (optimistic concurrency) ilgili iki kullanım olanağı daha oluştu. Evet bir değil, iki:

SNAPSHOT isolation (ALLOW_SNAPSHOT_ISOLATION) ve READ COMMITTED SNAPSHOT isolation (READ_COMMITTED_SNAPSHOT).

Her iki yaklaşımın temelinde de değişen satırların önceki hallerinin tempdb’de tutulması yani satır versiyonları yatıyor. Ama hem yönetimleriyle hem de davranışlarıyla ilgili önemli farklar var.

SQL Server konusunda en iyi kaynaklardan biri olan Inside Microsoft SQL Server serisinin Inside Microsoft SQL Server 2005: The Storage Engine cildinde Kalen Delaney bu konuyu çok iyi özetlemiş. Aşağıda bu kitabın 393 ve 394. sayfalarında sunulan tablonun Türkçe bir özetini bulabilirsiniz:

Snapshot Isolation için SI, Read Committed Snapshot Isolation için RCSI kısaltmalarını kullanacağım. Tüm maddeleri çevirmedim, en önemli olanları buradadır.

* RCSI’yı kullanmak için veritabanınızı RCSI kullanacak şekilde tek bir ALTER komutu çalıştırmanız yeterlidir. Oturum (session) seviyesinde ya da kodda yapmanız gereken bir değişiklik yoktur. Oysa SI’yı kullanmak için hem veritabanı seviyesinde açmanız hem de oturum seviyesinde SET TRANSACTION ISOLATION LEVEL SNAPSHOT ifadesini kullanmanız gerekir.

* SI’yı açmayla ilgili komut, başka kullanıcılar bağlıyken de çalıştırılabilir. Devam eden transactionlar süresince bir geçiş süreci yaşanır. Eski transactionlar tamamlanınca geçiş de tamamlanmış olur. Oysa RCSI’yı açan komutu çalıştırırken veritabanına bağlı başka kullanıcı olmamalıdır.

* Aynı transaction içinde birden fazla veritabanından veri okuyorsanız, iki kullanım birbirinden önemli bir farklılık gösterir. SI’da böyle bir transaction’ın açılabilmesi için her iki veritabanının SI’yı uyguluyor olması gerekir. Oysa RCSI’da böyle bir şart yoktur. RCSI kullanımında bir veritabanında güncel satırı okumak için beklemek, diğer veritabanında ise satırların eski versiyonlarından okuyor olmak kabul edilebilir bir davranış şeklidir.

* SI’da SQL Server servisinin yeniden başlamasını gerektiren bir durumda satır versiyon bilgileri kaybolmuş olacağından (tempdb’de tutuldukları için) eski snapshot transactionlarının veritabanına bağlanması önlenmelidir. RCSI ise oturumla ilgili değil, tamamen nesnelerle ilgilidir. RCSI’da aynı transaction içinde bir tabloya birden fazla erişim olduğunda, her statement ilgili verinin uygun olup olmadığını kontrol eder, uygunsa yeni veriyi, değilse satırların eski versiyonlarındaki bilgiyi okur. Oysa SI kullanımında aynı transaction içinde tekrar erişimlerin tamamı transactionın başlangıcındaki erişilebilirlik yeri neresiyse oradan okumaya çalışır.

* En önemli farklardan biri: SI transactionı içindeki bir sorgu transaction başlamadan önce commit edilmiş olan verileri görür (gerekirse ilgili satırların tempdb’deki eski versiyonları üzerinden) ve transaction içindeki her ifade aynı seti görür. RCSIde çalışan bir ifade ise, ifade başlamadan önce commit edilmiş olan herşeyi görür. RCSIde açılmış bir transaction içinde aynı satırları okuyon iki ifade arada bu satırları kilitleyen başka transaction commit olmuşsa farklı bilgiler görüntüleyebilir.

* SI aynı satırları update etmeye çalışan oturumlar arasında oluşabilecek çatışmalar açısından çok iyi değildir. Unutmayın ki bu bir iyimser eşzamanlı kullanım modelidir. Okuyucular yazıcıları yazıcıları okuyucuları engellemez. Ama yazıcılar yazıcıları bekletmeyip hata vermelerine sebep olurlar. RCSI’da ise update çatışması durumu yoktur.

Bu yazı SQL Server içinde yayınlandı. Kalıcı bağlantıyı yer imlerinize ekleyin.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google fotoğrafı

Google hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s