Новое: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 источников: карьерные страницы компаний и джоб-борды.

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

Как Rails обрабатывает транзакции базы данных и что такое ApplicationRecord.transaction?

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

ApplicationRecord.transaction оборачивает блок в SQL-транзакцию с автоматическим ROLLBACK при исключении. Для вложенных транзакций используйте savepoints через requires_new: true.

Базовое использование

# Всё внутри блока выполняется атомарно
ApplicationRecord.transaction do
  account_from = Account.lock.find(params[:from_id])
  account_to   = Account.lock.find(params[:to_id])

  raise "Insufficient funds" if account_from.balance < params[:amount]

  account_from.decrement!(:balance, params[:amount])
  account_to.increment!(:balance, params[:amount])
end
# При любом исключении — автоматический ROLLBACK

Транзакции в Rails: ApplicationRecord.transaction

Транзакция на уровне модели

# Эквивалентно ApplicationRecord.transaction — одно и то же соединение
User.transaction do
  user = User.create!(email: params[:email])
  Profile.create!(user: user, bio: params[:bio])
end

# Можно вызвать на экземпляре
@user.transaction do
  @user.update!(role: :admin)
  AuditLog.create!(actor: current_user, action: "promote", target: @user)
end

Savepoints (вложенные транзакции)

ApplicationRecord.transaction do
  User.create!(email: "alice@example.com")

  # requires_new: true создаёт SAVEPOINT
  ApplicationRecord.transaction(requires_new: true) do
    User.create!(email: "bob@example.com")
    raise ActiveRecord::Rollback  # откатывает только до savepoint
  end

  # Alice сохранена, Bob — нет
end

ActiveRecord::Rollback vs другие исключения

ApplicationRecord.transaction do
  user.update!(status: :banned)
  raise ActiveRecord::Rollback  # тихий откат, исключение НЕ пробрасывается выше
end
# Код после transaction выполняется нормально

ApplicationRecord.transaction do
  raise RuntimeError, "something broke"  # ROLLBACK + исключение всплывает
end
# RuntimeError нужно перехватить выше

after_commit и after_rollback колбэки

class Order < ApplicationRecord
  after_commit :send_confirmation_email, on: :create
  after_rollback :log_failure

  private

  def send_confirmation_email
    # Вызывается ТОЛЬКО после успешного COMMIT
    OrderMailer.confirmation(self).deliver_later
  end

  def log_failure
    Rails.logger.error "Order #{id} transaction rolled back"
  end
end

Блокировка строк (pessimistic locking)

ApplicationRecord.transaction do
  # SELECT ... FOR UPDATE — блокирует строку до COMMIT
  inventory = Inventory.lock.find(product_id)
  raise "Out of stock" if inventory.quantity < requested
  inventory.decrement!(:quantity, requested)
end

# Optimistic locking через lock_version (без транзакции)
product = Product.find(id)
product.update!(price: new_price)  # автоматически проверяет lock_version
# При конфликте — ActiveRecord::StaleObjectError

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

  • Вызов внешних сервисов (HTTP, email, Sidekiq jobs) внутри транзакции опасен: если транзакция откатится после вызова, внешнее действие уже выполнилось. Используйте after_commit для side effects.
  • Вложенные транзакции без requires_new: true не создают реальный savepoint — внутренний ActiveRecord::Rollback откатывает всю внешнюю транзакцию.
  • save/update (без bang) внутри транзакции не вызывают исключение при ошибке валидации — транзакция не откатится автоматически. Используйте save!/update!.
  • Длинные транзакции держат блокировки на строки и замедляют всю систему — выносите бизнес-логику за пределы транзакции, оставляя внутри только DB-операции.
  • Deadlock возникает при блокировке строк в разном порядке из разных потоков — всегда захватывайте блокировки в одном и том же детерминированном порядке (например, по возрастанию ID).
  • after_commit в тестах по умолчанию не срабатывает при использовании use_transactional_fixtures = true — нужен test_after_commit gem или отключение транзакционных фикстур.
  • Multi-DB приложения: ApplicationRecord.transaction работает только на одном соединении — для распределённых транзакций между БД нужны компенсирующие операции (saga pattern).
  • ActiveRecord::Rollback не пробрасывается сквозь вложенные транзакции без requires_new: true — поведение неочевидно и часто удивляет.

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

  • Сводить transactions к названию метода без lifecycle и failure path.
  • Игнорировать модель runtime: Rails 8.1 строит приложение вокруг Rack, routing, controllers, Active Record, views и conventions over configuration.
  • Не отделять validation, authorization, transaction boundary и business logic.

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

  • Объясняет transactions через конкретную точку lifecycle в Ruby on Rails.
  • Приводит корректный минимальный пример без вымышленных методов или callbacks.
  • Называет edge cases: пустые значения, ошибки, транзакции, безопасность или concurrency.

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

Проверить себя по теме Ruby on Rails →

Источники

  • https://guides.rubyonrails.org/active_record_basics.html
  • https://guides.rubyonrails.org/
←Предыдущий вопросКак писать тесты с использованием RSpec в Rails?Следующий вопрос→В чём разница между system tests, integration tests и unit tests в Rails?

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

Ruby on RailsBackend-Engineeringdatabase-modelingruby-on-rails-ecosystemtransaction-design

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

  • Как Rails обрабатывает защиту от CSRF?
  • Что такое паттерн MVC и как Rails его реализует?
  • Что такое migrations в Rails и как их создавать и запускать?
  • В каких backend-проектах Ruby on Rails является сильным выбором, а где лучше выбрать более простой или другой стек?