Eş Zamanlılık(Concurrency) ve İzolasyon Seviyesi (Isolation Level) Kavramı – 1
Günümüzde veritabanlarını düşündüğümüzde hemen hemen hepsi, birçok uygulamaya , servise veya raporlama ihtiyaçlarına aynı anda hizmet eder niteliktedir ve birçok zaman veritabanı kaynakları aynı anda okuma ve yazma ihtiyaçlarına cevap vermelidir. Bu şartlar göz önünde bulundurulduğunda eş zamanlılık (concurrency) problemleri ve izolasyon seviyesi (isolation level) kavramı büyük önem taşımaktadır. Bu makale serisinde sizlere bu iki temel kavramdan , sorunlarından, çözümlerinden ve örneklerinden bahsedeceğim.
Uygulamalarımız için yapılan iş analizleri sonucunda bazı eş zamanlılık sorunlarını çözümlememiz gerekebilir. Örneğin bir tablodan bir değer okuduğumuzda o değerle doğru bir işlem yapmak için işlem sonuna kadar değiştirilmemesi gerekebillir. Her okumamızda bir önce okuduğumuz değerin değişmesi durumunda mantıksal veri bütünlüğü bozulabilir. Bu senaryoda karşılaşılan eş zamanlılık problemi “Non-Repetable Read” yani tekrarlanamayan kayıt okuma olarak adlandırılmaktadır.
Bir başka senaryoda ise bir kayda iki farklı oturumdan erişim sonucunda oturumların sırasal bir şekilde kaydı değiştirmesiyle ikinci değişklik ilk değişikliği ezecektir. Bu yüzden ilk değişikliği yapan oturum değiştirdiği kaydı okuduğu zaman değiştirdiği değerlerden farklı bilgilerle karşılaşacaktır. Bu senaryoda karşılaşılan eş zamanlılık problemi “Lost-Update” yani kayıp güncelleme olarak adlandırılmaktadır.
Bir başka senaryoda ise iki oturumdan birisi bir kaydı değiştirir fakat henüz değişikliği onaylamaz. Diğer kaynak ise onaysız bu değişikliği okuyarak işlem yapabilir. Bu senaryoda karşılaşılan eş zamanlılık problemi “Dirty Read” yani kirli kayıt okuma olarak adlandırılmaktadır.
Son senaryomuzda ise iki oturumdan birisi, bir veya birden fazla kaydı okur. Bu esnada başka bir oturumdan gelen işlem okunan aralığa denk gelecek bir kayıt ekler veya okunan kayıtlardan kayıt siler. Bu durumda okuma yapan oturum yeni gelen kayıtları okumamış olur veya varolmayan yani hayalet bir kaydı okumuş olur. Bu senaryoda karşılaşılan eş zamanlılık problemi “Phantom Read” hayalet kayıt okuma olarak adlandırılmaktadır.
Şimdi bu anlattığımız eş zamanlılık problemlerine neden veya çözüm olan izolasyon seviyelerini inceleyelim.
SQL Server 2005 ve sonraki sürümleri önceki sürümlerine ek olarak “SNAPSHOT” izolasyon seviyesinin gelmesiyle beş farklı izolasyon seviyesi desktekler. Bunlar kötümserlik seviyesine göre zayıftan güçlüye göre aşağıdaki gibidir.
-
Read Uncommitted izolasyon seviyesinde bir işlem (transaction) okuma yaptığı esnada farklı işlemlerin (transaction) onaysız (UNCOMMITTED) veri manipulasyonlarına takılmaz. Dolayısıyla en az bloklanma problemine neden olan izolasyon seviyesidir. Fakat kirli kayıt okuma, hayalet kayıt okuma ve tekrarsız kayıt okuma eş zamanlılık sorunlarına yol açabilir.
-
Read Committed izolasyon seviyesinde bir işlem (transaction) okuma yaptığı esnada farklı işlemlerin (transaction) onaysız (UNCOMMITTED) veri manupulasyonlarına takılırlar ve onaylanana kadar bloklanırlar. Bu izolasyon seviyesi kirli kayıt okuma problemine engel olurken tekrarsız kayıt okuma ve hayalet kayıt okuma eş zamanlılık problemlerine yol açabilir.
-
Repeatable Read izolasyon seviyesinde bir işlem (transaction) okuma yaptığı esnada başka bir işlem (transaction) okunan kaydı değiştiremez veya silemez. Bu izolasyon seviyesi kirli kayıt okuma ve tekrarsız kayıt okuma problemlerini engeller, ama hayalet kayıt okuma eş zamanlılık problemine neden olabilir.
-
Serializable izolasyon seviyesinde bir işlem (transaction) okuma yapığı esnada başka bir oturumdan kendisi tarafından okunan kayıt veya kayıtların silinmesine, güncellenmesine ve okunan aralığa yeni bir kayıt eklenmesine engel olur. Bu izalasyon seviyesinde bloklanma problemleri ile çok karşılaşılır ve eşzamanlılık üzerinde çok ağır bir etki yaşanır fakat tüm eş zamanlılık problemlerini engeller.
-
Snapshot izolasyon seviyesinde bir işlem (transaction) bir kayda okuma yaptığı esnada kaydın son onaylı versiyonuna erişir. Başka bir oturumdan gelen kayıt değişiklik işlemi (transaction) gerçekleştiğinde okunan kaydın orjinal hali tempdb veritabanında versiyonlanır (row versioning), bu esnada snapshot izolasyon seviyesine sahip oturumda devam eden okuma işlemininin(transaction) tekrarlanması durumunda talep edilen veri tempdb veritabanında saklanan versionlarından karşılanır. Hatta snapshot izolasyon seviyesi kullanan bir transaction, kendisinin henüz okumadığı bir kayıdı bile başladığı haliyle okur. Başka bir transaction bu sırada o kaydı değiştirip commit etmiş olsa bile... Bu izolasyon seviyesi okunan kaydın işlem(transaction) sonuna kadar hep aynı değerde okunmasını garanti eder. Bu izolasyon seviyesi kirli kayıt okuma , tekrarsız kayıt okuma eş zamanlılık problemlerini egellemenin yanı sıra sorguların bloklanmasını büyük ölçüde azaltır. Bu izolasyon seviyesi kullanabilmek için veritabanı seviyesinde “ALLOW_SNAPSHOT_ISOLATION” özelliğini açmak gerekir.Bu özellik açıldıktan sonra veritabanı üzerinde işlem(transaction) başlatılarak yapılan her değişiklikten etkilenen kayıtlar versiyonlanır ve versiyonlanmış bilgiye snapshot izolasyon seviyesi sayesinde erişilir. “READ_COMMITTED_SNAPSHOT” veritabanı özelliği read commited izolasyon seviyesini açılan oturumlarda şeffaf bir şekilde read committed snapshot olarak değiştirip verisyonlanmış bilgiye varsayılan olarak erişimini sağlar. Bu izolasyon seviyesi okunan kaydın işlem(transaction) sonuna kadar hep aynı değerde okunmasını garanti etmez. Read committed snapshot izolasyon seviyesi kirli kayıt okuma eş zamanlılık problemine engel olurken tekrarsız kayıt okuma eş zamanlılık problemi oluşmasına neden olabilir.
Bu makalemde sizlere eş zamanlılık sorunları ve izolasyon seviyeleri hakkında temel kavramları anlatmaya çalıştım. Konu ile ilgili bir sonraki makalemde eş zamanlılık problemleri, izolasyon seviyeleri, sorgu ipuçları (query hints) ve kilit tipleri ile ilgili örneklerle konuyu detaylandırıyor olacağım.