RB Ruby  ·  25 вопросов  ·  ~70 мин  ·  ⏱ Таймер 10:00  ·  Средний  · 

Транзакции и целостность данных в Rails

Тест «Транзакции и целостность данных в Rails» проверяет чтение кода, объяснение причин, поиск скрытых рисков, выбор исправления и работу с граничными сценариями. В нём 25 вопросов, 14 заданий с Ruby-кодом и 5 тематических шкал.

Отвечено: 0 из 25
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. Время — 70 минут. У каждого задания ровно один правильный вариант. Фрагменты рассчитаны на Ruby 4.0.6; задания Rails — на Rails 8.1.3. После завершения откроются общий процент, 5 тематических результатов и разбор всех ответов.
Вопрос 1 из 25
Разберите выражения по порядку. Как завершится фрагмент из раздела «Границы транзакции»? Выберите связку, в которой верны и основной вывод, и его обоснование.
RubyRuby — Границы транзакции
# Проследите выполнение и выберите точный результат.
ApplicationRecord.transaction do
  debit.update!(balance: debit.balance - 10)
  credit.update!(balance: credit.balance + 10)
end
Вопрос 2 из 25
Как следует прочитать результат показанного примера «Блокировки»? Правильным считается только полностью согласованное утверждение.
RubyRuby — Блокировки
# Проследите выполнение и выберите точный результат.
account.with_lock do
  raise 'insufficient' if account.balance < 10
  account.update!(balance: account.balance - 10)
end
Вопрос 3 из 25
Какой вариант верно описывает состояние объектов после выполнения кода «Повтор операции»? Оценивайте ответ целиком: обе части утверждения должны быть точными.
RubyRuby — Повтор операции
# Проследите выполнение и выберите точный результат.
Transfer.transaction do
  transfer = Transfer.find_or_initialize_by(request_id: request_id)
  transfer.amount ||= amount
  transfer.save!
end
# unique index on transfers.request_id
Вопрос 4 из 25
Что покажет выполнение этого фрагмента из раздела «Согласованность»? Ищите не знакомые слова, а технически непротиворечивую пару утверждений.
RubyRuby — Согласованность
# Проследите выполнение и выберите точный результат.
# Миграция PostgreSQL
add_check_constraint :accounts,
  'balance >= 0',
  name: 'accounts_balance_nonnegative'

# Модель может добавить понятное сообщение пользователю.
Вопрос 5 из 25
Разберите выражения по порядку. Как завершится фрагмент из раздела «Тестовый сценарий»? Оценивайте ответ целиком: обе части утверждения должны быть точными.
RubyRuby — Тестовый сценарий
# Проследите выполнение и выберите точный результат.
threads = 2.times.map do
  Thread.new do
    ActiveRecord::Base.connection_pool.with_connection do
      Account.find(account.id).withdraw!(10)
    end
  end
end
threads.each(&:join)
Вопрос 6 из 25
Где в показанном решении «Границы транзакции» скрыт дефект, который проявится не на каждом входе? Проверьте обе половины ответа: частично верный вариант остаётся неверным.
RubyRuby — Границы транзакции
# Обычный запуск проходит. Найдите скрытый риск.
ApplicationRecord.transaction do
  debit.update!(balance: debit.balance - 10)
  credit.update!(balance: credit.balance + 10)
end
Вопрос 7 из 25
Почему успешный пример ещё не доказывает надёжность решения «Блокировки»? Оценивайте ответ целиком: обе части утверждения должны быть точными.
RubyRuby — Блокировки
# Обычный запуск проходит. Найдите скрытый риск.
account.with_lock do
  raise 'insufficient' if account.balance < 10
  account.update!(balance: account.balance - 10)
end
Вопрос 8 из 25
Почему успешный пример ещё не доказывает надёжность решения «Повтор операции»? Верный вариант не содержит частично правильной подмены причины или следствия.
RubyRuby — Повтор операции
# Обычный запуск проходит. Найдите скрытый риск.
Transfer.transaction do
  transfer = Transfer.find_or_initialize_by(request_id: request_id)
  transfer.amount ||= amount
  transfer.save!
end
# unique index on transfers.request_id
Вопрос 9 из 25
Какое скрытое условие делает фрагмент «Согласованность» хрупким? Правильным считается только полностью согласованное утверждение.
RubyRuby — Согласованность
# Обычный запуск проходит. Найдите скрытый риск.
# Миграция PostgreSQL
add_check_constraint :accounts,
  'balance >= 0',
  name: 'accounts_balance_nonnegative'

# Модель может добавить понятное сообщение пользователю.
Вопрос 10 из 25
Обычный сценарий проходит. Какой риск остаётся в теме «Тестовый сценарий»? Не выбирайте ответ по одному точному фрагменту: вся формулировка должна выдерживать проверку.
RubyRuby — Тестовый сценарий
# Обычный запуск проходит. Найдите скрытый риск.
threads = 2.times.map do
  Thread.new do
    ActiveRecord::Base.connection_pool.with_connection do
      Account.find(account.id).withdraw!(10)
    end
  end
end
threads.each(&:join)
Вопрос 11 из 25
Какой контракт нужно помнить при ревью кода по теме «Границы транзакции»? Сопоставьте не только итог, но и правило, риск или проверку, которые с ним связаны.
Вопрос 12 из 25
Какой принцип темы «Блокировки» переносится на другие примеры того же типа? Оценивайте ответ целиком: обе части утверждения должны быть точными.
Вопрос 13 из 25
Какой контракт нужно помнить при ревью кода по теме «Повтор операции»? Правильным считается только полностью согласованное утверждение.
Вопрос 14 из 25
Какое правило остаётся верным, даже если вход и порядок вызовов изменятся, в теме «Согласованность»? Смотрите на всю причинную связку, а не только на знакомую формулировку.
Вопрос 15 из 25
Какое правило Ruby или Rails объясняет поведение в теме «Тестовый сценарий»? Верный вариант не содержит частично правильной подмены причины или следствия.
Вопрос 16 из 25
Какое изменение устраняет причину проблемы в теме «Границы транзакции», а не маскирует симптом? Правильным считается только полностью согласованное утверждение.
RubyRuby — Границы транзакции
# Выберите изменение, которое исправляет причину.
ApplicationRecord.transaction do
  debit.update!(balance: debit.balance - 10)
  credit.update!(balance: credit.balance + 10)
end
Вопрос 17 из 25
Что следует изменить в решении «Блокировки», чтобы закрыть исходный риск? Не выбирайте ответ по одному точному фрагменту: вся формулировка должна выдерживать проверку.
RubyRuby — Блокировки
# Выберите изменение, которое исправляет причину.
account.with_lock do
  raise 'insufficient' if account.balance < 10
  account.update!(balance: account.balance - 10)
end
Вопрос 18 из 25
Какое исправление уменьшает риск, не скрывая исходное поведение «Повтор операции»? Одного совпавшего вывода недостаточно — проверьте также вторую часть ответа.
RubyRuby — Повтор операции
# Выберите изменение, которое исправляет причину.
Transfer.transaction do
  transfer = Transfer.find_or_initialize_by(request_id: request_id)
  transfer.amount ||= amount
  transfer.save!
end
# unique index on transfers.request_id
Вопрос 19 из 25
Какое действие добавляет недостающую гарантию в блоке «Согласованность»? Смотрите на всю причинную связку, а не только на знакомую формулировку.
RubyRuby — Согласованность
# Выберите изменение, которое исправляет причину.
# Миграция PostgreSQL
add_check_constraint :accounts,
  'balance >= 0',
  name: 'accounts_balance_nonnegative'

# Модель может добавить понятное сообщение пользователю.
Вопрос 20 из 25
Какой рефакторинг делает контракт блока «Тестовый сценарий» явным и проверяемым? В правильном ответе вторая часть действительно объясняет или проверяет первую.
Вопрос 21 из 25
Какой сценарий должен падать на старой реализации и проходить после исправления «Границы транзакции»? Верный вариант не содержит частично правильной подмены причины или следствия.
Вопрос 22 из 25
Чем дополнить базовый тест, чтобы проверить ограничение темы «Блокировки»? Одного совпавшего вывода недостаточно — проверьте также вторую часть ответа.
Вопрос 23 из 25
Какой граничный сценарий лучше всего проверит решение по теме «Повтор операции»? Проверьте обе половины ответа: частично верный вариант остаётся неверным.
Вопрос 24 из 25
Какую границу контракта «Согласованность» нужно закрепить отдельным тестом? Не выбирайте ответ по одному точному фрагменту: вся формулировка должна выдерживать проверку.
Вопрос 25 из 25
Какой сценарий проверит не только результат, но и побочный эффект решения «Тестовый сценарий»? Выберите связку, в которой верны и основной вывод, и его обоснование.

Ответьте на все 25 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу