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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python8 901
  • Облачные технологии6 726
  • QA вакансии2 191
  • Android1 324
  • Инженер данных862
  • Продакт-менеджер318

Разработка

  • iOS1 240
  • Backend вакансии1 212
  • AI вакансии553
  • Fullstack вакансии503
  • Frontend вакансии428
  • Mobile вакансии28

По стеку

  • Go5 300
  • Java3 171
  • Kotlin1 128
  • Node.js1 016
  • Rust862
  • .NET676
  • PHP321
  • C++273
  • C#208

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

  • Kubernetes3 956
  • Linux-инфраструктура2 871
  • DevOps вакансии2 705
  • Terraform / IaC2 199
  • Мониторинг и Observability1 084
  • CI/CD920
  • SRE314
  • Кибербезопасность38

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

  • Аналитик данных529
  • Data Scientist437
  • Бизнес-аналитик398
  • Системный аналитик68

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

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

По регионам

  • Вакансии в США25 820
  • Вакансии в Европе10 304
  • Работа в России3 646
  • Вакансии в Канаде2 269

По формату

  • Удалённые вакансии42 570
  • Релокация в США25 820
  • Гибридная работа5 725
  • Офисная работа4 498

По уровню

  • Senior вакансии22 658
  • Middle вакансии11 501
  • Junior вакансии3 898

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

Все компании
  • Wise192 вакансии
  • Rakuten189 вакансий
  • ASML164 вакансии
  • Grab134 вакансии
  • Celonis47 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

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

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

В чём разница между SaveChanges() и SaveChangesAsync()?

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

SaveChanges() блокирует поток до завершения записи в БД. SaveChangesAsync() освобождает поток на время I/O и поддерживает CancellationToken. В ASP.NET Core всегда используйте SaveChangesAsync() — это обязательно для масштабируемости.

SaveChanges()

Синхронный вызов. Блокирует текущий поток до завершения операции с БД. Использовался в EF 6 и ранних приложениях на .NET Framework.

context.Products.Add(new Product { Name = "Widget", Price = 9.99m });
int affected = context.SaveChanges();
Console.WriteLine($"Saved {affected} records");

SaveChanges() vs SaveChangesAsync() в EF Core

Оба метода выполняют одно и то же: отправляют накопленные изменения из ChangeTracker в базу данных в рамках транзакции. Разница — в модели выполнения.

SaveChangesAsync()

Асинхронный вызов. Освобождает поток во время ожидания ответа от БД, что критично для масштабируемости веб-приложений.

context.Products.Add(new Product { Name = "Gadget", Price = 49.99m });
int affected = await context.SaveChangesAsync();
Console.WriteLine($"Saved {affected} records");

Ключевые отличия

  • Поток: SaveChanges блокирует поток; SaveChangesAsync возвращает его в пул потоков на время I/O.
  • Масштабируемость: в ASP.NET Core с тысячами параллельных запросов SaveChanges может исчерпать пул потоков; SaveChangesAsync — нет.
  • CancellationToken: SaveChangesAsync принимает токен отмены — можно прервать операцию при отключении клиента.
  • Транзакции: поведение одинаковое — оба автоматически оборачивают изменения в транзакцию.

Перехват через SaveChangesInterceptor

EF Core 5+ позволяет перехватывать оба вызова через интерцепторы:

public class AuditInterceptor : SaveChangesInterceptor
{
    public override async ValueTask<InterceptionResult<int>> SavingChangesAsync(
        DbContextEventData eventData,
        InterceptionResult<int> result,
        CancellationToken cancellationToken = default)
    {
        var context = eventData.Context!;
        foreach (var entry in context.ChangeTracker.Entries()
            .Where(e => e.State == EntityState.Added || e.State == EntityState.Modified))
        {
            if (entry.Entity is IAuditable auditable)
            {
                auditable.UpdatedAt = DateTime.UtcNow;
            }
        }
        return await base.SavingChangesAsync(eventData, result, cancellationToken);
    }
}

Переопределение SaveChangesAsync в DbContext

public class AppDbContext : DbContext
{
    public override async Task<int> SaveChangesAsync(CancellationToken ct = default)
    {
        // Автоматическое заполнение аудит-полей
        foreach (var entry in ChangeTracker.Entries<IAuditable>())
        {
            if (entry.State == EntityState.Added)
                entry.Entity.CreatedAt = DateTime.UtcNow;
            if (entry.State is EntityState.Added or EntityState.Modified)
                entry.Entity.UpdatedAt = DateTime.UtcNow;
        }
        return await base.SaveChangesAsync(ct);
    }
}

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

  • SaveChanges() в ASP.NET Core — антипаттерн: при пиковой нагрузке блокирует потоки и снижает throughput.
  • SaveChangesAsync без CancellationToken не позволяет прервать долгую транзакцию — всегда прокидывайте токен из контроллера/endpoint.
  • SaveChangesAsync не является потокобезопасным: DbContext нельзя использовать одновременно из нескольких потоков — даже с async/await.
  • При переопределении SaveChangesAsync не забывайте вызывать синхронный SaveChanges отдельно или делегировать его через базовый — иначе синхронный вызов не получит аудит-логику.
  • SaveChanges в консольных приложениях и фоновых сервисах вполне допустим, но SaveChangesAsync предпочтительнее для унификации кода.
  • Интерцепторы, зарегистрированные только для SavingChangesAsync, не срабатывают при синхронном SaveChanges — реализуйте оба метода.

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

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

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

  • Кандидат объясняет SaveChanges и SaveChangesAsync в I/O-bound persistence на конкретном примере, а не только определением.
  • Указывает последствия для производительности, тестируемости и поддержки.
  • Различает документированное поведение текущего стека и устаревшие практики.

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

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

Источники

  • https://learn.microsoft.com/en-us/ef/core/saving/basic
←Предыдущий вопросКак настраивать связи между сущностями с помощью Fluent API и data annotations?Следующий вопрос→Как оптимизировать производительность EF Core для сценариев с интенсивным чтением?

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

Entity Frameworkdata-access-designruntime-reasoning

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

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