Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 582новые вакансии за сутки·92 562вакансии открыты сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 220
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 402 кандидата открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 105
  • Облачные технологии14 068
  • QA вакансии3 460
  • Backend вакансии2 098
  • Инженер данных1 796
  • Продакт-менеджер1 248

Разработка

  • Android1 866
  • iOS1 699
  • Fullstack вакансии979
  • AI вакансии951
  • Frontend вакансии742
  • Mobile вакансии44

По стеку

  • Go8 651
  • Java6 544
  • Node.js2 018
  • .NET1 719
  • Kotlin1 623
  • Rust1 453
  • C#709
  • PHP683
  • C++571

DevOps и инфраструктура

  • Kubernetes7 761
  • DevOps вакансии6 057
  • Linux-инфраструктура5 492
  • Terraform / IaC4 259
  • CI/CD3 240
  • Мониторинг и Observability1 782
  • SRE565
  • Кибербезопасность450

Аналитика и данные

  • Data Scientist1 127
  • Бизнес-аналитик925
  • Аналитик данных845
  • Системный аналитик154

Другие направления

  • Проджект-менеджер611
  • UI/UX дизайн145
  • Ручное тестирование14

По регионам

  • Вакансии в США43 686
  • Вакансии в Европе23 668
  • Вакансии в Канаде4 413
  • Работа в России3 909

По формату

  • Удалённые вакансии73 889
  • Релокация в США43 686
  • Гибридная работа12 392
  • Офисная работа7 088

По уровню

  • Senior вакансии42 236
  • Middle вакансии20 545
  • Junior вакансии6 653

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab138 вакансий
  • Celonis39 вакансий
  • Spotify36 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме Entity FrameworkВсе вопросы
Entity FrameworkSeniorПроектирование систем

Как обрабатывать конфликты параллельного доступа (concurrency conflicts) в EF Core?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

EF Core реализует optimistic concurrency через атрибут [ConcurrencyCheck] или rowversion/xmin. При конфликте выбрасывается DbUpdateConcurrencyException. Нужно перехватить исключение, обновить значения из БД и повторить попытку или вернуть ошибку пользователю.

Настройка: rowversion и xmin

Для SQL Server используется тип rowversion (автоинкрементный бинарный токен):

public class Order
{
    public Guid Id { get; set; }
    public OrderStatus Status { get; set; }
    public decimal TotalAmount { get; set; }

    [Timestamp] // EF Core: IsConcurrencyToken + ValueGeneratedOnAddOrUpdate
    public byte[] RowVersion { get; set; } = null!;
}

Для PostgreSQL (Npgsql) используется системный столбец xmin — номер транзакции, изменившей строку:

public class Order
{
    public Guid Id { get; set; }
    public OrderStatus Status { get; set; }

    // Npgsql: автоматически добавляет xmin как concurrency token
    public uint Version { get; set; }
}

// В OnModelCreating:
modelBuilder.Entity<Order>()
    .UseXminAsConcurrencyToken();

Можно также пометить любое отдельное свойство через [ConcurrencyCheck] или .IsConcurrencyToken() в Fluent API — EF добавит его значение в WHERE-условие UPDATE.

Что такое concurrency conflict

Конфликт параллельного доступа возникает, когда два пользователя одновременно читают одну запись, оба вносят изменения и пытаются сохранить их. Без защиты последний пишущий молча перезапишет данные первого. EF Core поддерживает optimistic concurrency — блокировки не используются, вместо этого в момент UPDATE проверяется, не изменилась ли запись с момента её чтения.

Как EF генерирует SQL с проверкой

-- EF Core добавляет исходное значение rowversion/xmin в WHERE
UPDATE "Orders"
SET "Status" = @p0
WHERE "Id" = @p1 AND "xmin" = @p2;
-- Если строка изменилась другой транзакцией, xmin не совпадёт,
-- UPDATE затронет 0 строк → EF выбросит DbUpdateConcurrencyException

Обработка DbUpdateConcurrencyException

public async Task<Result> ConfirmOrderAsync(Guid orderId, CancellationToken ct)
{
    const int maxRetries = 3;

    for (int attempt = 0; attempt < maxRetries; attempt++)
    {
        try
        {
            var order = await _context.Orders
                .FirstOrDefaultAsync(o => o.Id == orderId, ct);

            if (order is null)
                return Result.NotFound();

            order.Status = OrderStatus.Confirmed;
            order.ConfirmedAt = DateTime.UtcNow;

            await _context.SaveChangesAsync(ct);
            return Result.Ok();
        }
        catch (DbUpdateConcurrencyException ex)
        {
            if (attempt == maxRetries - 1)
                return Result.Conflict("Запись была изменена другим пользователем.");

            // Обновить значения из базы и попробовать снова
            foreach (var entry in ex.Entries)
            {
                var dbValues = await entry.GetDatabaseValuesAsync(ct);
                if (dbValues is null)
                    return Result.NotFound(); // Запись удалена

                // Перезаписать текущие значения значениями из БД
                entry.OriginalValues.SetValues(dbValues);
                // entry.CurrentValues сохраняет изменения пользователя
            }
        }
    }

    return Result.Conflict();
}

Стратегии разрешения конфликтов

  • Store wins: перезаписать изменения пользователя данными из БД (entry.CurrentValues.SetValues(dbValues)). Безопасно, но пользователь теряет свои правки.
  • Client wins: сбросить OriginalValues до текущих значений БД и повторить сохранение — изменения пользователя победят. Риск: перезапись чужих изменений.
  • Merge: для каждого свойства отдельно решить, чьё значение оставить. Наиболее сложная, но правильная стратегия для collaborative editing.
  • Fail fast: вернуть HTTP 409 Conflict, показать пользователю актуальные данные и предложить повторить операцию осознанно.

Подводные камни

  • Disconnected сценарии: потеря исходного токена. В Web API клиент читает запись, затем возвращает изменённую версию через форму. Если RowVersion / xmin не передаётся обратно с запросом, EF не знает исходного значения и не сможет проверить конфликт. Всегда включайте токен в DTO.
  • [ConcurrencyCheck] на изменяемых полях. Если пометить часто меняющееся поле (например, UpdatedAt), конфликты будут возникать чаще, чем нужно. Лучше использовать выделенный rowversion/xmin.
  • Retry без reload приведёт к повторному исключению. После DbUpdateConcurrencyException нужно обновить OriginalValues через GetDatabaseValuesAsync(), иначе следующая попытка снова упадёт с той же ошибкой.
  • Удалённая запись в конфликте. GetDatabaseValuesAsync() вернёт null, если строка удалена. Это отдельный случай, который нужно обрабатывать явно.
  • Нет поддержки pessimistic locking из коробки. EF Core не предоставляет SELECT FOR UPDATE. Для pessimistic locking нужно использовать сырой SQL через ExecuteSqlRawAsync() или специфичный для провайдера метод (например, Npgsql FOR UPDATE).
  • Бесконечный retry. Без ограничения попыток код может зациклиться при постоянно конкурирующих транзакциях. Всегда задавайте maxRetries и экспоненциальную задержку или используйте Polly.
  • xmin и репликация. При использовании PostgreSQL streaming replication значение xmin на реплике отличается от мастера. Если читаете с реплики и пишете на мастер — concurrency token будет несовместим.

Частые вопросы на собеседовании

  • Как предотвратить проблему N+1 запросов в Entity Framework?
  • Как работают migration в EF Core? Как создавать и применять их?
  • В чём разница между eager loading, lazy loading и explicit loading?
  • Как сравнить Entity Framework с raw SQL, query builder и другими ORM по контролю, типобезопасности и производительности?

Типичные ошибки

  • Путать optimistic concurrency и разрешение конфликтов с похожим механизмом из другой версии или платформы.
  • Игнорировать runtime-границы Entity Framework: lifecycle, DI scope, SQL translation, UI thread или platform API.
  • Не обсуждать null/empty/error cases и поведение под нагрузкой.

Что проверяет интервьюер

  • Кандидат объясняет optimistic concurrency и разрешение конфликтов на конкретном примере, а не только определением.
  • Указывает последствия для производительности, тестируемости и поддержки.
  • Различает документированное поведение текущего стека и устаревшие практики.

Как вы знаете этот вопрос?

Проверить себя по теме Entity Framework →

Источники

  • https://learn.microsoft.com/en-us/ef/core/saving/concurrency
←Предыдущий вопросВ чём разница между `AsNoTracking()` и отслеживаемыми запросами, и когда использовать каждый вариант?Следующий вопрос→Расскажите о случае, когда Entity Framework помог или помешал вам при миграциях, транзакциях, оптимизации запросов или борьбе с N+1.

Связанные темы

Entity Frameworkdata-access-designruntime-reasoningsystem-design