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:

  1. İş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.

  2. 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.



Bu gibi daha fazla gönderi...

SemaphoreSlim Sınıfı: C#'ta Çoklu Görevlere Dayalı Programlama

2023-06-10 | #net #semaphoreslim

Genel Bakış SemaphoreSlim sınıfı, bir veya daha fazla threadin aynı anda belirli bir kaynağı veya işlemi kullanmasını kontrol etmek için C# ‘ta kullanılan bir yapıdır. SemaphoreSlim, aynı anda kaynağa erişebilecek thread sayısını sınırlar. SemaphoreSlim kullanımı, genellikle çok threadli uygulamalarda deadlock durumlarını önlemek ve belirli bir kaynağın aynı anda yalnızca bir veya daha fazla thread tarafından kullanılmasını sağlamak için kullanılır. SemaphoreSlim Kullanımı SemaphoreSlim sınıfı, aşağıdaki gibi kullanılır: SemaphoreSlim semaphoreSlim = new SemaphoreSlim(1, 1); Burada ilk parametre, aynı anda kaç threadin kaynağı kullanabileceğini belirler.

Devamı 


Basit Bir Rest Api Client Geliştirelim 9

2023-05-14 | #diy-rest-api-client #do-it-yourself #net #rest-api

HTTP isteklerini izlemek ve teşhis etmek için daha fazla yetenek ekleyerek, kütüphanemizi daha da geliştirebiliriz. Bu amaçla, isteklerin ve yanıtların bazı temel bilgilerini loga kaydeden bir middleware ekleyelim. Bu özellik, HTTP isteklerinin ve yanıtlarının kaydını tutmak için HttpClient‘in DelegatingHandler sınıfını kullanır. Bu, bir HTTP isteği gönderildiğinde ve bir yanıt alındığında çalışan bir kod parçasıdır. Bu durumda, HTTP isteklerinin ve yanıtlarının bazı temel bilgilerini loga kaydeder. Aşağıda, bu özelliği eklemek için gereken kod parçacığı bulunmaktadır:

Devamı 


Basit Bir Rest Api Client Geliştirelim 8

2023-05-12 | #diy-rest-api-client #do-it-yourself #net #rest-api

Bu noktada, geliştirmemiz gereken bir diğer önemli konu da güvenlikle ilgili olabilir. Özellikle, API çağrıları genellikle belirli bir kimlik doğrulama yöntemi gerektirir. Bunu sağlamak için, HTTP istemcimizi çok kullanılan iki kimlik doğrulama yöntemiyle, yani Basic Authentication ve Bearer (Token) Authentication ile uyumlu hale getirebiliriz. Bu amaçla, istemcimize iki yeni metot ekleyelim: public void SetBasicAuthentication(string username, string password) { var basicAuthValue = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{username}:{password}")); SetDefaultHeader("Authorization", $"Basic {basicAuthValue}"); } public void SetBearerToken(string token) { SetDefaultHeader("Authorization", $"Bearer {token}"); } Bu metodlar, Authorization başlığını ayarlar, böylece her HTTP talebi kimlik doğrulama bilgilerini içerir.

Devamı 