Eşzamanlılığı açıklama
Çok kullanıcılı veritabanlarının temel özelliklerinden biri eşzamanlılıktır. Verilerin aynı anda birçok kullanıcı tarafından güncellenmesi ve okunması sırasında tutarlı kalabilmesi için eşzamanlılık, kilitleme ve engellemeden yararlanır. Örneğin, nakliye maliyetleri nedeniyle tüm ürünlerimizin 5 ABD doları fiyat artışı vardır. Aynı zamanda, döviz kurları nedeniyle tüm ürünlerde 3% fiyat düşüşu vardır. Bu güncelleştirmeler tam olarak aynı anda gerçekleşirse, son fiyat değişken olacaktır ve büyük olasılıkla birçok hata olacaktır. Kilitlemeyi kullanarak, bir güncelleştirmenin diğer güncelleştirme başlamadan önce tamamlanmasını sağlayabilirsiniz.
Eşzamanlılık, işlem düzeyinde gerçekleşir. Yazma işlemi, diğer işlemlerin aynı verileri güncelleştirmesini ve hatta okumasını engelleyebilir. Aynı şekilde, okuma işlemi diğer okuyucuları ve hatta bazı yazarları engelleyebilir. Bu nedenle, aşırı miktarda veriyi kapsayan gereksiz yere uzun işlemlerden veya işlemlerden kaçınmak önemlidir.
Veritabanı sisteminin birden çok kullanıcıyı nasıl işlediğini tanımlamak için kullanılabilecek birçok belirli işlem yalıtım düzeyi vardır. Bu modülün amaçları doğrultusunda geniş yalıtım düzeyi, iyimser kilitleme ve kötümser kilitleme kategorilerini inceleyeceğiz.
Uyarı
Eşzamanlılığın ötesinde işlem kilitleme işleminin tüm ayrıntıları performansla ilgilidir ve yalnızca koda bağımlı değildir, ancak iyi kod daha iyi performans gösterir. Daha ayrıntılı bilgi için lütfen ayrıntılı SQL Server İşlem Kilitleme ve Satır Sürüm Oluşturma Kılavuzu'nu gözden geçirin. Engelleme hakkında bilgi için SQL Server Performansı belgelerini de gözden geçirin.
İyimser eşzamanlılık
İyimser kilitleme ile çakışan güncellemelerin az olacağı varsayımı vardır. İşlemin başlangıcında verilerin ilk durumu kaydedilir. İşlem işlenmeden önce geçerli durum ilk durumla karşılaştırılır. Durumlar aynıysa işlem tamamlanır. Durumlar farklıysa işlem geri alınır.
Örneğin, son yıl satış siparişlerini içeren bir tablonuz var. Bu veriler seyrek güncelleştirilir, ancak raporlar sık sık çalıştırılır. İyimser kilitleme kullanıldığında işlemler birbirini engellemez ve sistem daha verimli çalışır. Ne yazık ki, son yıllarda hatalar bulundu veriler ve güncelleştirmelerin gerçekleşmesi gerekiyor. Bir işlem her satırı güncelleştirirken, başka bir işlem aynı anda tek bir satırda küçük bir düzenleme yapar. İlk işlem çalışırken verilerin durumu değiştirildiğinden, tüm işlem geri alınır.
Kötümser eşzamanlılık
Kötümser kilitleme ile verilerde aynı anda birçok güncelleştirme olduğu varsayımı vardır. Kilitler kullanıldığında aynı anda yalnızca bir güncelleştirme gerçekleşebilir ve güncelleştirmeler gerçekleşirken verilerin okunması engellenir. Bu, önceki örnekte görüldüğü gibi büyük geri almaları engelleyebilir, ancak sorguların gereksiz yere engellenmesine neden olabilir.
En iyi performansı sağlamak için iyimser mi yoksa kötümser eşzamanlılık mı kullanacağınıza karar verirken verilerinizin doğasını ve veriler üzerinde çalışan sorguları göz önünde bulundurmanız önemlidir.
Anlık görüntü yalıtımı
SQL Server'da beş farklı yalıtım düzeyi vardır, ancak bu modülde yalnızca READ_COMMITTED_SNAPSHOT_OFF ve READ_COMMITTED_SNAPSHOT_ON odaklanacağız. READ_COMMITTED_SNAPSHOT_OFF, SQL Server için varsayılan yalıtım düzeyidir. READ_COMMITTED_SNAPSHOT_ON, Azure SQL Veritabanı için varsayılan yalıtım düzeyidir.
READ_COMMITTED_SNAPSHOT_OFF, sorgu okuma işlemi yalıtım düzeyini kullanıyorsa, etkilenen satırlarda kilitleri işlemin sonuna kadar tutar. Yeni satır oluşturma gibi bazı güncelleştirmelerin gerçekleşmesi mümkün olsa da, bu durum verilerde çoğu çakışan değişikliğin okunmasını veya güncelleştirilmesini engeller. Bu, kötümser eşzamanlılıktır.
READ_COMMITTED_SNAPSHOT_ON verilerin anlık görüntüsünü alır. Daha sonra bu anlık görüntüde güncelleştirmeler yapılır ve diğer bağlantıların özgün verileri sorgulamasına olanak sağlanır. İşlemin sonunda verilerin geçerli durumu anlık görüntüyle karşılaştırılır. Veriler aynıysa, işlem işlenir. Veriler farklıysa işlem geri alınır.
Yalıtım düzeyini READ_COMMITTED_SNAPSHOT_ON olarak değiştirmek için aşağıdaki komutu çalıştırın:
ALTER DATABASE *db_name* SET READ_COMMITTED_SNAPSHOT ON;
Yalıtım düzeyini READ_COMMITTED_SNAPSHOT_OFF olarak değiştirmek için aşağıdaki komutu çalıştırın:
ALTER DATABASE *db_name* SET READ_COMMITTED_SNAPSHOT OFF;
Veritabanı, read committed snapshot özelliğini açmak için değiştirildiyse, varsayılan read committed yalıtım düzeyini kullanan tüm işlemler iyimser kilitleme kullanır.
Uyarı
Anlık görüntü yalıtımı yalnızca tamamlanan okuma işlemleri için gerçekleşir. Diğer yalıtım düzeylerini kullanan işlemler etkilenmez.