LINQ ve Optimistic 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 optimistic concurrency kullanarak veri bütünlüğünü nasıl koruyabileceğimizi inceleyeceğiz.
Optimistic Concurrency Nedir?
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. Bu yaklaşım, düşük çakışma riski olan senaryolarda veri bütünlüğünü korumak için daha uygundur. Optimistic concurrency, daha yüksek performans ve kaynakların daha etkin kullanılması gibi avantajlara sahiptir.
Optimistic concurrency, aşağıdaki avantaj ve dezavantajlara sahiptir:
Avantajlar:
- Daha yüksek performans
- Kaynakların daha etkin kullanılması
Dezavantajlar:
- Veri çakışma riski daha yüksektir.
- Veri çakışması durumunda işlem geri alınması ve yeniden denemesi gerekebilir.
LINQ ve Optimistic Concurrency Kullanımı
LINQ ve Entity Framework kullanarak optimistic 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, öğrenci sınıfına bir “RowVersion” özelliği ekleyerek, veri tabanındaki her değişikliği takip edelim:
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
[Timestamp]
public byte[] RowVersion { get; set; }
}
Son olarak, veritabanındaki belirli bir öğrenci kaydını güncellemek için optimistic concurrency uygulayalım:
public void UpdateStudent(int studentId, string newName)
{
using (var context = new MyDbContext())
{
// Öğrenciyi al
var student = context.Students.Find(studentId);
if (student != null)
{
// Öğrenci adını güncelle
student.Name = newName;
bool saveFailed;
do
{
saveFailed = false;
try
{
// Değişiklikleri kaydet
context.SaveChanges();
}
catch (DbUpdateConcurrencyException ex)
{
saveFailed = true;
// Çakışan öğeyi çözümle
var entry = ex.Entries.Single();
// Veritabanındaki güncel değerleri al
entry.Reload();
// Yeni değerleri ayarla
entry.Property("Name").CurrentValue = newName;
// Yeniden denemeden önce önceki hataları temizle
context.Entry(student).State = EntityState.Modified;
}
} while (saveFailed);
}
}
}
Bu örnekte, SaveChanges
metodunu kullanarak, öğrenci kaydını güncellemeye çalışıyoruz. Eğer işarasında başka bir kullanıcı veya işlem tarafından veri güncellenirse, DbUpdateConcurrencyException
istisnası fırlatılacaktır. Bu durumda, veritabanındaki güncel değerleri alıp, yeniden işlem yapmayı deneyerek optimistic concurrency kontrolünü sağlamış oluruz. Bu yaklaşım, çakışma durumunda işlemi geri almayı ve yeniden denemeyi gerektirse de, genellikle daha yüksek performans ve kaynakların etkin kullanılması sağlar.
Optimistic Concurrency İle İlgili Dikkat Edilmesi Gerekenler
Optimistic concurrency uygularken dikkat etmemiz gereken bazı noktalar vardır:
-
İşlem geri alımı ve yeniden deneme: Optimistic concurrency ile çalışırken, veri çakışması durumunda işlem geri alınması ve yeniden denemesi gerekebilir. Bu sürecin doğru şekilde yönetilmesi, veri bütünlüğünü korumak için önemlidir.
-
Veri çakışma riskinin değerlendirilmesi: Optimistic concurrency, düşük çakışma riski olan senaryolarda daha uygundur. Yüksek çakışma riski olan senaryolarda, veri bütünlüğünü sağlamak için pessimistic concurrency kullanılması daha uygun olabilir.
Pessimistic Concurrency ile Karşılaştırma
Optimistic concurrency’e alternatif olarak, veri bütünlüğünü korumak için pessimistic concurrency kullanılabilir. Pessimistic concurrency, bir işlem başladığında ilgili verinin kilitlenmesi ve işlem tamamlanana kadar kilidin sürdürülmesi prensibine dayanır.
Pessimistic concurrency’nin avantajları şunlardır:
- Veri bütünlüğü sağlar.
- Eşzamanlı işlemlerde çakışma ihtimalini düşürür.
Dezavantajları ise şunlardır:
- Düşük performans.
- Kaynakların etkin kullanılamaması.
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ç
Optimistic concurrency, veri bütünlüğünü korumak için kullanılan bir yöntemdir. LINQ ile veritabanı işlemlerinde optimistic concurrency uygulamak, düşük çakışma riski olan senaryolarda daha yüksek performans ve kaynakların etkin kullanılması sağlar. Bununla birlikte, optimistic concurrency kullanırken veri çakışma riskinin doğru şekilde yönetilmesi ve işlem geri alımı ve yeniden deneme süreçlerinin dikkate alınması gerekmektedir.