Skip to content

Entity Framework - Concurrency

Giriş

Entity Framework'te Concurrency (Eşzamanlılık), aynı veri üzerinde birden fazla kullanıcının veya işlemin eşzamanlı olarak çalışmasını yönetmeyi sağlayan bir mekanizmadır. Mid-level geliştiriciler için bu mekanizmanın anlaşılması ve etkin kullanımı kritik öneme sahiptir.

Concurrency'nin Önemi

  1. Veri Tutarlılığı
  2. Veri çakışmalarını önleme
  3. Veri bütünlüğünü koruma
  4. İlişkisel veri yönetimi
  5. Transaction yönetimi

  6. Performans

  7. Eşzamanlı işlem desteği
  8. Kaynak kullanımı optimizasyonu
  9. Sistem yanıt süreleri
  10. Ölçeklenebilirlik

  11. Bakım

  12. Daha az kod
  13. Daha kolay debug
  14. Daha iyi test edilebilirlik
  15. Daha kolay bakım

Concurrency Teknikleri

  1. Optimistic Concurrency

    // Timestamp/RowVersion ile
    public class Blog
    {
        public int Id { get; set; }
        public string Title { get; set; }
        [Timestamp]
        public byte[] RowVersion { get; set; }
    }
    
    // Concurrency token ile
    public class Blog
    {
        public int Id { get; set; }
        public string Title { get; set; }
        [ConcurrencyCheck]
        public string ConcurrencyToken { get; set; }
    }
    
    // Kullanımı
    try
    {
        var blog = await _context.Blogs.FindAsync(1);
        blog.Title = "Güncellenmiş Blog";
        await _context.SaveChangesAsync();
    }
    catch (DbUpdateConcurrencyException ex)
    {
        // Concurrency çakışması yönetimi
        var entry = ex.Entries.Single();
        var databaseValues = await entry.GetDatabaseValuesAsync();
        var clientValues = entry.CurrentValues;
    
        // Çakışma çözümü
        entry.OriginalValues.SetValues(databaseValues);
        // veya
        entry.CurrentValues.SetValues(databaseValues);
    }
    

  2. Pessimistic Concurrency

    // Transaction ile
    using var transaction = await _context.Database.BeginTransactionAsync(
        IsolationLevel.Serializable);
    try
    {
        var blog = await _context.Blogs
            .FromSqlRaw("SELECT * FROM Blogs WITH (UPDLOCK) WHERE Id = {0}", 1)
            .FirstOrDefaultAsync();
    
        blog.Title = "Güncellenmiş Blog";
        await _context.SaveChangesAsync();
        await transaction.CommitAsync();
    }
    catch
    {
        await transaction.RollbackAsync();
        throw;
    }
    
    // Stored procedure ile
    var blog = await _context.Blogs
        .FromSqlRaw("EXEC GetBlogWithLock @Id = {0}", 1)
        .FirstOrDefaultAsync();
    

  3. Concurrency Resolution

    // Client wins
    public async Task UpdateBlogClientWins(Blog blog)
    {
        try
        {
            await _context.SaveChangesAsync();
        }
        catch (DbUpdateConcurrencyException ex)
        {
            var entry = ex.Entries.Single();
            entry.OriginalValues.SetValues(await entry.GetDatabaseValuesAsync());
            await _context.SaveChangesAsync();
        }
    }
    
    // Store wins
    public async Task UpdateBlogStoreWins(Blog blog)
    {
        try
        {
            await _context.SaveChangesAsync();
        }
        catch (DbUpdateConcurrencyException ex)
        {
            var entry = ex.Entries.Single();
            var databaseValues = await entry.GetDatabaseValuesAsync();
            entry.CurrentValues.SetValues(databaseValues);
            await _context.SaveChangesAsync();
        }
    }
    
    // Merge
    public async Task UpdateBlogMerge(Blog blog)
    {
        try
        {
            await _context.SaveChangesAsync();
        }
        catch (DbUpdateConcurrencyException ex)
        {
            var entry = ex.Entries.Single();
            var databaseValues = await entry.GetDatabaseValuesAsync();
            var clientValues = entry.CurrentValues;
    
            // Özel merge mantığı
            foreach (var property in clientValues.Properties)
            {
                var databaseValue = databaseValues[property];
                var clientValue = clientValues[property];
    
                if (clientValue != databaseValue)
                {
                    // Merge stratejisi
                    clientValues[property] = MergeValues(clientValue, databaseValue);
                }
            }
    
            await _context.SaveChangesAsync();
        }
    }
    

  4. Custom Concurrency

    // Özel concurrency kontrolü
    public class BlogConcurrencyHandler : IConcurrencyHandler<Blog>
    {
        public async Task HandleConcurrencyAsync(
            DbContext context,
            Blog entity,
            DbUpdateConcurrencyException ex)
        {
            var entry = ex.Entries.Single();
            var databaseValues = await entry.GetDatabaseValuesAsync();
    
            // Özel concurrency stratejisi
            if (ShouldOverride(databaseValues, entity))
            {
                entry.OriginalValues.SetValues(databaseValues);
                await context.SaveChangesAsync();
            }
            else
            {
                throw new ConcurrencyException("Concurrency çakışması");
            }
        }
    }
    
    // Kullanımı
    try
    {
        await _context.SaveChangesAsync();
    }
    catch (DbUpdateConcurrencyException ex)
    {
        var handler = new BlogConcurrencyHandler();
        await handler.HandleConcurrencyAsync(_context, blog, ex);
    }
    

  5. Concurrency Monitoring

    // Concurrency izleme
    public class ConcurrencyMonitor
    {
        private readonly DbContext _context;
    
        public ConcurrencyMonitor(DbContext context)
        {
            _context = context;
        }
    
        public async Task MonitorConcurrencyAsync()
        {
            var concurrencyConflicts = _context.ChangeTracker
                .Entries()
                .Where(e => e.State == EntityState.Modified)
                .Select(e => new
                {
                    Entity = e.Entity,
                    OriginalValues = e.OriginalValues,
                    CurrentValues = e.CurrentValues
                })
                .ToList();
    
            // Concurrency izleme işlemleri
        }
    }
    

Best Practices

  1. Concurrency Tasarımı
  2. Uygun concurrency stratejisi seçimi
  3. Concurrency token yönetimi
  4. Transaction yönetimi
  5. Error handling

  6. Performans

  7. Concurrency optimizasyonu
  8. Lock stratejileri
  9. Resource yönetimi
  10. Query optimizasyonu

  11. Güvenlik

  12. Concurrency doğrulama
  13. Access control
  14. Audit logging
  15. Data validation

  16. Bakım

  17. Kod organizasyonu
  18. Documentation
  19. Testing
  20. Monitoring

Mülakat Soruları

Temel Sorular

  1. Entity Framework'te concurrency nedir?
  2. Cevap: Concurrency, aynı veri üzerinde birden fazla kullanıcının veya işlemin eşzamanlı olarak çalışmasını yönetmeyi sağlayan bir mekanizmadır.

  3. Entity Framework'te optimistic concurrency nedir?

  4. Cevap: Optimistic concurrency, veri üzerinde kilit tutmadan, değişikliklerin kaydedilmesi sırasında çakışma kontrolü yapan bir stratejidir.

  5. Entity Framework'te pessimistic concurrency nedir?

  6. Cevap: Pessimistic concurrency, veri üzerinde kilit tutarak, diğer işlemlerin erişimini engelleyen bir stratejidir.

  7. Entity Framework'te concurrency token nedir?

  8. Cevap: Concurrency token, veri değişikliklerini takip etmek için kullanılan bir alandır.

  9. Entity Framework'te concurrency çakışması nasıl yönetilir?

  10. Cevap: DbUpdateConcurrencyException yakalanarak ve uygun strateji uygulanarak yönetilir.

Teknik Sorular

  1. Optimistic concurrency nasıl implemente edilir?
  2. Cevap:

    public class Blog
    {
        [Timestamp]
        public byte[] RowVersion { get; set; }
    }
    
    try
    {
        await _context.SaveChangesAsync();
    }
    catch (DbUpdateConcurrencyException ex)
    {
        var entry = ex.Entries.Single();
        entry.OriginalValues.SetValues(await entry.GetDatabaseValuesAsync());
        await _context.SaveChangesAsync();
    }
    

  3. Pessimistic concurrency nasıl implemente edilir?

  4. Cevap:

    using var transaction = await _context.Database.BeginTransactionAsync(
        IsolationLevel.Serializable);
    try
    {
        var blog = await _context.Blogs
            .FromSqlRaw("SELECT * FROM Blogs WITH (UPDLOCK) WHERE Id = {0}", 1)
            .FirstOrDefaultAsync();
    
        await _context.SaveChangesAsync();
        await transaction.CommitAsync();
    }
    catch
    {
        await transaction.RollbackAsync();
        throw;
    }
    

  5. Concurrency resolution stratejileri nelerdir?

  6. Cevap:

    // Client wins
    entry.OriginalValues.SetValues(await entry.GetDatabaseValuesAsync());
    
    // Store wins
    entry.CurrentValues.SetValues(await entry.GetDatabaseValuesAsync());
    
    // Merge
    foreach (var property in clientValues.Properties)
    {
        // Merge stratejisi
    }
    

  7. Custom concurrency nasıl implemente edilir?

  8. Cevap:

    public class CustomConcurrencyHandler : IConcurrencyHandler<Blog>
    {
        public async Task HandleConcurrencyAsync(
            DbContext context,
            Blog entity,
            DbUpdateConcurrencyException ex)
        {
            // Özel concurrency stratejisi
        }
    }
    

  9. Concurrency monitoring nasıl yapılır?

  10. Cevap:
    var concurrencyConflicts = _context.ChangeTracker
        .Entries()
        .Where(e => e.State == EntityState.Modified)
        .Select(e => new
        {
            Entity = e.Entity,
            OriginalValues = e.OriginalValues,
            CurrentValues = e.CurrentValues
        })
        .ToList();
    

İleri Seviye Sorular

  1. Entity Framework'te concurrency performansı nasıl optimize edilir?
  2. Cevap:

    • Concurrency stratejisi optimizasyonu
    • Lock stratejileri
    • Resource yönetimi
    • Query optimizasyonu
    • Caching stratejileri
  3. Entity Framework'te distributed sistemlerde concurrency nasıl yönetilir?

  4. Cevap:

    • Distributed transactions
    • Data partitioning
    • Replication
    • Consistency
    • Conflict resolution
  5. Entity Framework'te high concurrency senaryolarında nasıl yönetilir?

  6. Cevap:

    • Optimistic concurrency
    • Pessimistic concurrency
    • Retry mekanizmaları
    • Queue yönetimi
    • Batch processing
  7. Entity Framework'te concurrency monitoring ve profiling nasıl yapılır?

  8. Cevap:

    • Concurrency metrics
    • Resource monitoring
    • Profiling tools
    • Health checks
    • Logging
  9. Entity Framework'te custom concurrency stratejileri nasıl geliştirilir?

  10. Cevap:
    • IConcurrencyHandler implementasyonu
    • Custom resolution stratejileri
    • Custom monitoring
    • Custom validation
    • Custom persistence