Rails В транзакции, почему вся база данных заблокирована вместо одной записи? - PullRequest
2 голосов
/ 14 марта 2019

Я испытываю это. В транзакции сама база данных блокируется вместо одной записи.

Вот фрагмент моих кодов.

код 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 работал хорошо!

1 Ответ

0 голосов
/ 14 марта 2019

Разработка того, что мы написали в комментариях:

Транзакции ActiveRecord являются подключением к базе данных, а не к модели.

https://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html

В среде разработки Sqlite3 не может поддерживать одновременное изменение базы данных.

...