Modern yazılım geliştirme süreçlerinde, birden fazla kullanıcının aynı anda bir veri kaynağına erişim ve değişiklik yapma ihtimali, eşzamanlılık çakışması (Concurrency Conflict) sorununu ortaya çıkara
- Yazılım Uzmanları
- 08 Aralık 2024
- 45 kez görüntülendi.
Concurrency Conflict (Eşzamanlılık Çakışması) Nasıl Yönetilir?
Modern yazılım geliştirme süreçlerinde, birden fazla kullanıcının aynı anda bir veri kaynağına erişim ve değişiklik yapma ihtimali, eşzamanlılık çakışması (Concurrency Conflict) sorununu ortaya çıkarabilir. Bu makalede, eşzamanlılık çakışmalarının nedenlerini, çözüm yöntemlerini ve kod örnekleriyle bunların nasıl uygulandığını inceleyeceğiz.
Eşzamanlılık Çakışması Nedir?
Eşzamanlılık çakışması, bir veri kaynağında aynı anda birden fazla işlem yapıldığında ortaya çıkan bir durumdur. Örneğin:
-
Kullanıcı A bir kayıt üzerinde değişiklik yaparken, Kullanıcı B aynı kayıtı farklı bir değerle güncelleyebilir.
-
Sonraki kaydedilen işlem, diğerinin yaptığı değişikliği ezebilir veya tutarsızlıklara yol açabilir.
Eşzamanlılık Çakışması Nasıl Yönetilir?
1. Optimistic Concurrency (Optimizm Yöntemi)
Bu yöntemde, bir kayıt üzerinde yapılan değişiklikler, diğer işlemlerin durumu değiştirmediği varsayılarak yapılır. Kayıt kaydedilmeden önce, veri kaynağındaki mevcut durum kontrol edilir.
Kod Örneği:
public async Task UpdateRecordAsync(int id, string newValue)
{
using (var context = new AppDbContext())
{
var record = await context.Records.FindAsync(id);
if (record == null)
{
throw new Exception("Kayıt bulunamadı.");
}
var originalRowVersion = record.RowVersion;
record.Value = newValue;
try
{
await context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException ex)
{
var entry = ex.Entries.First();
var currentValues = entry.GetDatabaseValues();
if (currentValues == null)
{
throw new Exception("Kayıt silinmiş.");
}
throw new Exception("Eşzamanlılık çakışması: Kayıt başka bir kullanıcı tarafından değiştirilmiş.");
}
}
}
2. Pessimistic Concurrency (Pesimizm Yöntemi)
Bu yöntemde, bir kayıt üzerinde işlem yapan bir kullanıcı, diğer kullanıcıların aynı kayıda erişimini engeller. Bu genellikle veri tabanı kilitleme mekanizmalarıyla gerçekleştirilir.
Kod Örneği:
public async Task UpdateRecordWithLockAsync(int id, string newValue)
{
using (var context = new AppDbContext())
{
var record = await context.Records
.FromSqlInterpolated($"SELECT * FROM Records WITH (UPDLOCK) WHERE Id = {id}")
.FirstOrDefaultAsync();
if (record == null)
{
throw new Exception("Kayıt bulunamadı.");
}
record.Value = newValue;
await context.SaveChangesAsync();
}
}
3. Concurrency Token Kullanımı
Entity Framework Core gibi modern ORM'ler, çakışmaları yönetmek için RowVersion
veya benzeri bir concurrency tokenı kullanır. Bu token her güncellemede değiştirilir ve çakışmaları tespit etmek için kullanılır.
Kod Örneği:
public class Record
{
public int Id { get; set; }
public string Value { get; set; }
[Timestamp]
public byte[] RowVersion { get; set; }
}
En İyi Yöntem Hangisidir?
Eşzamanlılık çakışması yönetiminde seçilecek yöntem, uygulamanın gereksinimlerine bağlıdır:
-
Okuma yoğunluklu sistemler için: Optimistic Concurrency daha uygundur.
-
Yoğun yazma ve güncelleme gerektiren sistemler için: Pessimistic Concurrency tercih edilebilir.
-
Orta seviyede performans ve veri doğruluğu için: Concurrency Token etkili bir yöntemdir.
Sonuç
Eşzamanlılık çakışması, doğru yönetilmediğinde ciddi veri tutarsızlıklarına yol açabilir. Bu makalede anlatılan yöntemler ve kod örnekleri, geliştiricilerin bu sorunları etkin bir şekilde ele alabilmesine yardımcı olacaktır. Uygulamanızın özelliklerine uygun bir yöntem seçerek veri tutarlılığını garanti altına alabilirsiniz.
Bu yazıya 0 yorum yapılmış.