Ruby: SQLite3 :: BusyException: база данных заблокирована: - PullRequest
41 голосов
/ 23 августа 2011

Натолкнулся на это сообщение об ошибке во время разработки сегодня вечером: SQLite3::BusyException: database is locked:

У меня есть две модели:

  • Подкасты имеют много треков
  • Треки принадлежат Подкастам.
  • Файлы подкастов размещены на mixcloud .

Чтобы создать подкаст:

  • пользователь отправляет URL для подкаста на mixcloud
  • rails app получает json feed, связанный с url
  • json используется для установки атрибутов (заголовок, изображение и т. Д.) Для нового объекта подкаста

Я пытаюсь, чтобы мое приложение rails использовало тот факт, что канал json также детализирует имена (и исполнителей) треков, которые принадлежат этому подкасту.

Я думал, что следующий метод before_validation автоматически создаст все связанные дорожки при каждом создании нового подкаста.

class Podcast < ActiveRecord::Base
  attr_accessible :mixcloud_url, :lots, :of, :other, :attrs
  has_many :tracks    
  before_validation :create_tracks
  def create_tracks
    json = Hashie::Mash.new HTTParty.get(self.json_url)    
    json.sections.each do |section|
      if section.section_type=="track"
          Track.create(:name=>section.track.name, :podcast_id=>self.id)
      end
    end             
  end
end

Как я могу обойти это? Похоже, что rails (или sqlite3) не любит, когда я создаю новые экземпляры связанной модели таким образом. Как еще я могу это сделать? Я подозреваю, что это такая же проблема с Rails, как и с sqlite3. Я могу выложить больше кода, если это поможет.

Ответы [ 15 ]

0 голосов
/ 03 января 2018

Я использовал DB Browser для SQLite и консоль rails одновременно.Закрытие DB Browser for SQLite исправило проблему для меня.

0 голосов
/ 04 марта 2017

Это происходит, когда вы вносите какие-либо изменения вручную непосредственно в Браузер БД SQlite (например, удаляете строку или изменяете значение любого столбца) и забываете сохранить эти изменения. Любые сделанные изменения должны быть сохранены (ctrl + s). Если не сохранено, SQLite блокирует базу данных до тех пор, пока вы не сохраните эти изменения.

Я сделал то же самое, и моя проблема была решена!

0 голосов
/ 07 октября 2016

SQLite имеет проблемы с параллелизмом. Я изменил sqlite на Postgresql и проблема исчезла

0 голосов
/ 03 октября 2016

У меня была такая же проблема. Для тех, у кого есть SQLite Database Browser. Мне не нужно было закрывать браузер баз данных SQLite. Мне осталось только нажать кнопку «Написать изменения». Он выделен и его не нужно выделять.

0 голосов
/ 20 января 2016

Да, это старый вопрос, и здесь уже есть много ответов. Но ни один из них не помог мне, а это означало, что мне потребовалось много времени, чтобы наконец понять проблему. Я нашел то, что сработало, и поделюсь им, если это может вызвать у вас проблему.

Я использовал браузер SQLITE (это браузер базы данных с графическим интерфейсом). Я буду называть его «GUI» здесь (чтобы избежать путаницы с браузером слова, являющимся вашим браузером localhost :: 8000 chrome или любым другим.
http://sqlitebrowser.org/

Я следил за тем, что записывалось в базу данных, и открыл графический интерфейс, когда мое приложение rails работало в моем браузере chrome. Я бы обновил графический интерфейс, чтобы увидеть, добавляет ли он данные так, как я ожидал.

Что касается отладки, я решил удалить строку из графического интерфейса SQLite, чтобы понять, будет ли мое приложение правильно реагировать на отсутствующую строку.

Как выясняется, браузер SQLite на самом деле не удаляет строку (что вызвало у меня замешательство по поводу того, почему мое приложение функционировало так, как будто строка все еще была там, даже если визуально отсутствовало на GUI). В любом случае, после 30 минут разочарования я закрыл графический интерфейс SQLite, а затем получил уведомление с вопросом, хочу ли я сохранить внесенные в базу данных изменения. Я наивно нажал «Нет» и закрыл приложение.

Очевидно, что происходит то, что графический интерфейс затем заблокировал базу данных, потому что в моей базе данных были строки, которые были "мягко удалены" без фиксации удаления. Таким образом, GUI (из-за отсутствия лучшего термина) содержал базу данных в Limbo.

Это объясняет, почему a) мое приложение не работало так, как будто отсутствовала строка, потому что оно еще не было удалено, а B) объясняет, почему база данных заблокирована. Он все еще ждал, когда я совершу удаление.

Итак, чтобы решить проблему, я просто снова открыл графический интерфейс и удалил ту же строку, а затем закрыл графический интерфейс, и в этот раз я щелкнул «Да» при запросе сохранения изменений в базе данных . Он сохранил удаление и разблокировал базу данных, и теперь мое приложение работает!


Надеюсь, это поможет кому-то еще, у которого может быть та же проблема, но с использованием графического интерфейса браузера SQLite. Это может быть то, что блокирует вашу базу данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...