web-dev-qa-db-ja.com

Ruby:SQLite3 :: BusyException:データベースはロックされています:

今夜の開発中にこのエラーメッセージを見つけました:SQLite3::BusyException: database is locked:

私には2つのモデルがあります:

  • ポッドキャストには多くのトラックがあります
  • トラックはポッドキャストに属します。
  • ポッドキャストファイルは mixcloud でホストされます。

ポッドキャストを作成するには:

  • ユーザーがmixcloudでポッドキャストのURLを送信します
  • RailsアプリはURLに関連付けられたJSONフィードを取得します
  • jsonは、新しいPodcastオブジェクトの属性(タイトル、画像など)を設定するために使用されます

私はRailsアプリを取得して、jsonフィードがこのPodcastに属するトラックの名前(およびアーティスト)も詳述するという事実を利用しようとしています。

次のbefore_validationメソッドは、新しいPodcastを作成するたびに、関連するすべてのトラックを自動的に作成すると考えました。

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の問題。それが助けになればもっとコードを投稿できます。

42
stephenmurdoch

Railsコンソールが開いているときに開発中のSQLiteロックでこの問題に遭遇した人は、これを試してください:

次を実行するだけです:

ActiveRecord::Base.connection.execute("BEGIN TRANSACTION; END;")

とにかく、コンソールが保持していたトランザクションをクリアし、データベースを解放するようです。

これは、delayed_jobを実行するときに特に問題になります。トランザクションを閉じるときに失敗するようです。

61
trisweb

私にとって...私が抱えていた問題は、Railsしばらく開いていたコンソールがSQLiteとの接続をロックしているように見えたということでした。

そのため、そのコンソールを終了し、Webサーバー(Thin)を再起動すると、完全に機能しました。

@triswebの提案を試してみましたが、うまくいきませんでした。

22
marcamillion

SQLiteは、ここで遭遇する問題である同時アクセスに実際に使用されることを想定していません。 database.ymlファイルのタイムアウトを増やしてみてください。この場合、回避策があります。ただし、MySQLやPgSQLなどの複数の接続をサポートする別のデータベースに切り替えることをお勧めします。

21
Devin M

同じ「ActiveRecord :: StatementInvalid:SQLite3 :: BusyException:データベースがロックされています:INSERT INTO "users"( "created_at"、 "email"、 "name"、 "password_digest"、 "updated_at")VALUES(?、? 、 ?、 ?、 ?)" 問題。 Googleで見つかったあらゆる方法を試しましたが、失敗しました。この問題は、SQLite Database Browserを閉じたときに解決されました。

16
Tarique

2つのガードまたはいくつかのコンソールが実行されていないことを確認してください。必要な場合は、上記の「名前なし」の回答を必死に見てください。

プールを増やすこともできます:

例:config/database.ymlのテストセクションを以下のように変更します

test:
    adapter: sqlite3
    database: db/test.sqlite3
    pool: 50
    timeout: 5000
5
Luke

おそらく、別のbashでRailsコンソールを開いている場合は、閉じる必要があります(ctrl + D)。

3
ark1980

私の問題は、「DB Browser for SQlite」という名前のデータベース管理プログラムを開いたことです。このデータベース管理プログラムを閉じ、問題は解決しました。

1
hofffman

ほとんどの場合、Railsコードとは関係ありません。同時にコンソールをサンドボックスオプション(Rails console --sandbox)は、コンソールが基本的にすべてをロールバックするために終了するのを待っているため、SQLiteで問題を体系的にします。

この場合、@ triswebからの上記のソリューションは機能しませんが、コンソールを終了します。

1
Antoine Lizée

実際、私にとっては、この問題を解決するために殺すRailsを見つけました。

使用する "ps aux | grep Rails"進行中のRailsプロセスID。

"kill -9 [Rails-pid]"

プロセスを強制終了します。

その後、動作します

1
BufBills

SQLite用DBブラウザー とRailsコンソールを同時に使用していました。DB Browser for SQLite私のために問題を修正しました。

0
webster

.sqlite3ファイルを保存する必要があります。 SQliteのDBブラウザーに移動し、ctrl + sまたはFile-> Write Changesを行います。

0
Arkadiusz Mazur

これは、SQlite DBブラウザーに直接手動で変更を加えた場合(行の削除や列の値の変更など)に、それらの変更を保存し忘れた場合に発生します。行った変更はすべて保存する必要があります(ctrl + s)。保存しない場合、SQLiteはこれらの変更を保存するまでデータベースをロックします。

私は同じことをし、私の問題は解決しました!

0

SQLiteには並行性に関する問題があります。 Postgresqlでsqliteを変更しましたが、問題はなくなりました

0
itsnikolay

同じ問題がありました。 SQLite Database Browserを使用している場合。 SQLite Database Browserを閉じる必要はありませんでした。 [変更を書き込む]ボタンをクリックするだけで済みました。強調表示されており、強調表示する必要はありません。

0
jesse lawson

はい、これは古い質問であり、すでに多くの回答があります。しかし、それらのどれも私のために機能しませんでした。つまり、問題を最終的に理解するのに長い時間がかかりました。 私はそれがあなたのために問題を引き起こしている可能性があるものである場合に備えて、うまくいったものを見つけ、それを共有します。

SQLITEブラウザ(GUIデータベースブラウザ)を使用していました。ここでは、「GUI」と呼びます(Wordブラウザーがlocalhost :: 8000 chromeブラウザーなどであるという混乱を避けるためです。
http://sqlitebrowser.org/

データベースに何が書き込まれているかを監視し、GUIを開いている間、Rails appはmy chromeブラウザで実行しました。GUIを更新して確認します期待どおりにデータを追加していた場合。

デバッグの問題として、SQLite GUIから行を削除して、アプリが行の欠落に適切に反応するかどうかを確認することにしました。

判明したように、SQLite Browserは実際に行を削除しません(行がまだ静止しているようにアプリが動作している理由について、私に混乱を引き起こしています) GUIで視覚的に欠落していましたが)。とにかく30分間のフラストレーションの後、SQLite GUIを閉じた後、行ったデータベースへの変更を保存するかどうかを尋ねる通知を受け取りました。 「いいえ」をクリックしてアプリを閉じました。

どうやらどうなるのかというと、GUIがデータベースをロックしたのは、データベースに削除をコミットせずに「ソフト削除」された行があったからです。したがって、GUIは(より良い用語がないために)データベースをLimboに保持していました。

これは、a)実際にまだ削除されていないため、行が欠落しているようにアプリが動作していなかった理由、およびB)は、データベースがロックした理由を説明しています。削除をコミットするのを待っていました。

したがって、問題を解決するために、GUIをもう一度開いて同じ行を削除し、GUIを閉じて、このデータベースへの変更を保存するかどうかを尋ねるときに「はい」をクリックしました。削除が保存され、データベースのロックが解除され、アプリが機能するようになりました!


これは、同じ問題を抱えているかもしれないが、SQLite Browser GUIインターフェースを使用している他の誰かに役立つことを願っています。これがデータベースをロックしている可能性があります。

0
jacurtis

サーバーを再起動するか、実行中のすべてのRails console、私のために働いた

0