LINQ ve Pessimistic Concurrency: Veri Bütünlüğünü Koruma Yöntemleri
[en] Read in English 2023-05-08
Veri tabanları ile çalışırken, eşzamanlı işlemlerin doğru bir şekilde yönetilmesi ve veri bütünlüğünün korunması büyük önem taşır. Concurrency kontrolü, birden fazla kullanıcının veya işlemin aynı verilere eşzamanlı olarak erişmesini yönetmek için kullanılır. Bu makalede, LINQ (Language Integrated Query) ile pessimistic concurrency kullanarak veri bütünlüğünü nasıl koruyabileceğimizi inceleyeceğiz.
Pessimistic Concurrency Nedir?
Pessimistic concurrency, bir işlem başladığında ilgili verinin kilitlenmesi ve işlem tamamlanana kadar kilidin sürdürülmesi prensibine dayanır. Bu yöntem, eşzamanlı işlemlerde çakışma ihtimalini düşürerek veri bütünlüğünü korumaya yardımcı olur. Bununla birlikte, bu yöntem daha düşük performans ve kaynakların etkin kullanılamaması gibi dezavantajlara sahiptir.
Pessimistic concurrency, aşağıdaki avantaj ve dezavantajlara sahiptir:
Avantajlar:
- Veri bütünlüğü sağlar.
- Eşzamanlı işlemlerde çakışma ihtimalini düşürür.
Dezavantajlar:
- Düşük performans.
- Kaynakların etkin kullanılamaması.
LINQ ve Pessimistic Concurrency Kullanımı
LINQ kullanarak pessimistic concurrency uygulaması şu şekilde yapılabilir:
Öncelikle, Entity Framework’te kullanılacak olan veritabanı nesnesini tanımlayalım:
public class MyDbContext : DbContext
{
public DbSet<Student> Students { get; set; }
}
Ardından, veritabanındaki belirli bir öğrenci kaydını güncellemek için pessimistic concurrency uygulayalım:
public void UpdateStudent(int studentId, string newName)
{
using (var context = new MyDbContext())
{
// Öğrenciyi pessimistic kilit kullanarak al
var student = context.Students.SqlQuery("SELECT * FROM Students WITH (UPDLOCK, ROWLOCK) WHERE Id = @id", new SqlParameter("@id", studentId)).SingleOrDefault();
if (student != null)
{
// Öğrenci adını güncelle
student.Name = newName;
// Değişiklikleri kaydet
context.SaveChanges();
}
}
}
Bu örnekte, SqlQuery
metodunu kullanarak, öğrenci kaydını UPDLOCK ve ROWLOCK ile alıyoruz. Bu sayede, bu kayıt üzerinde bir işlem gerçekleştirilirken diğer işlemlerin bu kayda erişimi engellenmiş olur. İşlem tamamlandığında, değişiklikler kaydedilir ve kilit otomatik olarak kaldırılır.
Pessimistic Concurrency İle İlgili Dikkat Edilmesi Gerekenler
Pessimistic concurrency uygularken dikkat etmemiz gereken bazı noktalar vardır:
-
Kilit süresi: Kilit süresi, bir kaynağın ne kadar süreyle kilitli kalacağını belirler. İşlemin gerçekleşme süresine göre kilit süresini ayarlamak önemlidir. Çok kısa kilit süreleri, işlemin tamamlanmasını engelleyebilirken, çok uzun kilit süreleri kaynakların etkin kullanılamamasına yol açar.
-
Kilit düzeyi: Kilit uygulanacak kaynakların düzeyi, performans ve veri bütünlüğü açısından önemlidir. Satır düzeyinde kilitler (ROWLOCK), daha iyi performans sunar, ancak daha fazla hafıza kullanır. Tablo düzeyinde kilitler (TABLOCK) ise daha az hafıza kullanır, ancak performansı düşürür.
-
Ölü kilitleme (deadlock) riski: Pessimistic concurrency ile çalışırken, ölü kilitleme riski vardır. Ölü kilitleme, iki veya daha fazla işlem karşılıklı olarak birbirinin kaynaklarını beklerken oluşan durumdur. Bu durumu önlemek için zaman aşımı süreleri ve kilit sıralaması gibi yöntemler kullanılabilir.
Optimistic Concurrency ile Karşılaştırma
Pessimistic concurrency’e alternatif olarak, veri bütünlüğünü korumak için optimistik concurrency kullanılabilir. Optimistic concurrency, işlem başladığında kaynağın kilitlenmediği, ancak işlem tamamlanmadan önce yapılan değişikliklerin kontrol edildiği bir yöntemdir.
Optimistic concurrency’in avantajları şunlardır:
- Daha yüksek performans
- Kaynakların daha etkin kullanılması
Dezavantajları ise şunlardır:
- Veri çakışma riski daha yüksektir.
- Veri çakışması durumunda işlem geri alınması ve yeniden denemesi gerekebilir.
Kullanım durumunuza bağlı olarak optimistik concurrency veya pessimistic concurrency yöntemlerinden birini tercih etmeniz gerekebilir. Genellikle düşük çakışma riski olan senaryolarda optimistik concurrency, yüksek çakışma riski olan senaryolarda ise pessimistic concurrency kullanılması daha uygundur.
Sonuç
Pessimistic concurrency, veri bütünlüğünü korumak için kullanılan bir yöntemdir. LINQ ile veritabanı işlemlerinde pessimistic concurrency uygulamak, eşzamanlı işlemlerde çakışma riskini azaltır ve veri bütünlüğünü korumaya yardımcı olur.