Я испытываю это. В транзакции сама база данных блокируется вместо одной записи.
Вот фрагмент моих кодов.
код 1)
lesson = Lesson.last
ActiveRecord::Base.transaction do
lesson.start_time = Time.now
lesson.save
sleep(10.seconds)
raise "let's roll back lesson!!"
end
код 2)
lesson = Lesson.first
lesson.start_time = Time.now
lesson.save
Я выполнил code1 в консоли1 и code2 в консоли2, которая была открыта в другом терминале. Очевидно, что две консоли совместно используют базу данных в локальной сети.
Код 2 сгенерировал ошибку как
ActiveRecord::StatementInvalid: SQLite3::BusyException: database is locked: UPDATE "lessons" SET "start_time" = ?, "updated_at" = ? WHERE "lessons"."id" = ?
Я предполагал, что код 1 предотвратит изменение урока (Lesson.last) из-за возникшего исключения. Это работает хорошо, но что не соответствует моим ожиданиям, код 2 не обновляет урок (Lesson.first).
Если это так (блокировка всей базы данных вместо одной записи), то сложная бизнес-логика будет зависеть от остановки транзакции.
1019 * Любопытно! Что будет хорошей стратегией, чтобы код 2 работал хорошо!