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:

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

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

  3. Ö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.



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ı 