Ruby: SQLite3:: BusyException: la base de données est verrouillée:

rencontré ce message d'erreur alors que le développement de ce soir: SQLite3::BusyException: database is locked:

j'ai deux modèles:

  • Podcasts ont beaucoup de Pistes de
  • Les pistes
  • appartiennent aux Podcasts.
  • Les fichiers de Podcast
  • sont hébergés sur mixcloud .

pour créer un Podcast:

  • l'utilisateur soumet une url pour un podcast sur mixcloud
  • application rails, l'accaparement des flux json associés avec l'url
  • json est utilisé pour définir des attributs (titre, image etc) sur le nouvel objet Podcast

j'essaie d'obtenir mon application rails pour profiter du fait que le flux json détaille également les noms (et les artistes) des pistes qui appartiennent à ce Podcast.

j'ai pensé que la méthode avant validation suivante créerait automatiquement toutes les pistes associées chaque fois que nous créons un nouveau 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

comment je peux contourner ça? Il semble que les rails (ou sqlite3) ne m'aiment pas en créant de nouvelles instances d'un modèle associé de cette façon. Sinon, comment puis-je faire cela? Je soupçonne qu'il s'agit autant d'un problème de rails qu'un problème de sqlite3. Je peux poster plus de code si ça va aider.

38
demandé sur stephenmurdoch 2011-08-23 03:09:48

15 réponses

pour toute autre personne rencontrant ce problème avec le verrouillage SQLite dans le développement quand une console Rails est ouverte, essayez ceci:

exécutez juste ce qui suit:

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

pour moi de toute façon, il semble effacer toute transaction que la console gardait et libère la base de données.

C'est surtout un problème pour moi quand je lance delayed_job, qui semble échouer à fermer la transaction assez souvent.

58
répondu trisweb 2012-07-17 19:52:51

SQLite n'est pas vraiment censé être utilisé pour l'accès simultané qui est le problème que vous rencontrez ici. Vous pouvez essayer d'augmenter le délai dans votre fichier database.yml qui peut être une solution de contournement pour vous dans ce cas. Cependant, je vous recommande de passer à une autre base de données qui supporte plusieurs connexions comme MySQL ou PgSQL.

21
répondu Devin M 2011-08-22 23:15:12

pour moi...la question que j'avais était qu'il semblait que la Console de Rails que j'avais ouvert pendant un certain temps était de verrouiller une connexion avec SQLite.

donc une fois que j'ai quitté cette console, et redémarré mon serveur web (fin) ça a fonctionné parfaitement.

j'ai essayé la suggestion de @trisweb mais ça n'a pas marché pour moi.

21
répondu marcamillion 2012-11-16 03:27:19

j'ai eu le même "ActiveRecord::StatementInvalid: SQLite3::BusyException: base de données est verrouillée: INSÉRER DANS les "utilisateurs" ("created_at", "email", "nom", "password_digest", "updated_at") VALUES (?, ?, ?, ?, ?)" question. J'ai essayé toutes les solutions trouvées dans Google et j'ai échoué. Le problème a été résolu pour moi quand j'ai fermé mon navigateur de base de données SQLite.

13
répondu tarique313 2013-08-16 19:06:51

assurez-vous que vous n'avez pas 2 gardes ou plusieurs consoles en marche. Si vous voulez être sûr de voir désespérément la réponse "Pas de nom" ci-dessus.

vous pouvez également essayer d'augmenter la piscine:

par exemple: modifier la section test de votre configuration / base de données.yml comme ci-dessous

test:
    adapter: sqlite3
    database: db/test.sqlite3
    pool: 50
    timeout: 5000
5
répondu Luke 2014-09-24 12:56:01

probablement vous avez une console de Rails ouverte sur une autre bash, si c'est le cas vous devez la fermer (ctrl+D).

2
répondu ark1980 2016-01-26 01:49:38

en fait pour moi, j'ai trouvé que tuer des rails aide à résoudre ce problème.

utilisez "ps aux | grep rails" pour trouver le numéro d'identification du processus en cours des rails. puis utiliser

"kill -9 [rails-pid]"

pour tuer les processus.

alors ça marchera

1
répondu BufBills 2014-02-18 04:12:02

il est fort probable qu'il ne s'agisse pas d'un code ferroviaire. En utilisant en même temps la console avec l'option sandbox ( rails console --sandbox ), rend le problème systématique avec SQLite, puisque la console est fondamentalement en attente de quitter pour tout faire reculer.

la solution ci-dessus de @trisweb ne fonctionnera pas dans ce cas, mais quitter la console le fera.

1
répondu Antoine Lizée 2015-05-10 08:52:43

Oui c'est une vieille question et il y a déjà beaucoup de réponses ici. Mais aucun d'entre eux travaillaient pour moi, le sens qu'il m'a fallu du temps pour enfin comprendre le problème. j'ai trouvé ce qui a fonctionné et je le partagerai au cas où ce serait ce qui pourrait causer le problème pour vous aussi.

j'utilisais le navigateur SQLITE (son navigateur de base de données GUI). Je vais l'appeler " GUI " ici (pour éviter toute confusion avec le mot navigateur étant votre localhost::8000 navigateur chrome ou quoi que ce soit.

http://sqlitebrowser.org/

je surveillais ce qui était écrit dans la base de données et j'ai ouvert l'interface graphique pendant que mon application rails fonctionnait dans mon navigateur chrome. Je rafraîchirais L'interface graphique pour voir si elle ajoutait les données comme je m'y attendais.

comme une question de débogage j'avais décidé de supprimer une rangée de L'interface graphique SQLite pour que je puisse voir si mon application réagirait comme il se doit, la rangée a disparu.

comme il s'avère, le navigateur SQLite ne supprime pas réellement la ligne (provoquant la confusion de mon côté quant à savoir pourquoi mon application agissait comme si la ligne était encore là, même si elle était visuellement manquante sur l'interface graphique). Quoi qu'il en soit, après 30 minutes de frustration, j'ai fermé L'interface graphique de SQLite et j'ai reçu un avis me demandant si je voulais enregistrer les modifications que j'avais apportées à la base de données. j'ai naïvement cliqué sur "Non" et a fermé l'application.

apparemment ce qui se passe est que l'interface graphique a ensuite verrouillé la base de données parce qu'il y avait des lignes dans ma base de données qui avaient été en quelque sorte" soft-deleted " sans s'engager à la supprimer. Ainsi, l'interface graphique (faute d'un meilleur terme) tenait la base de données dans le flou.

cela explique pourquoi a) mon application n'agissait pas comme si la rangée était manquante, parce qu'elle n'avait pas encore été supprimée, et B) explique pourquoi la base de données est verrouillée. Il attendait toujours que je fasse les suppressions.

donc pour résoudre le problème, j'ai tout simplement ouvert l'interface graphique une fois de plus et supprimé la même ligne, puis fermé l'interface graphique et cette fois j'ai cliqué sur" Oui "en demandant de sauvegarder les modifications dans la base de données . Il a sauvé la suppression et déverrouillé la base de données et maintenant mon application fonctionne!


j'espère que cela aidera quelqu'un d'autre qui pourrait avoir le même problème, mais utilisait L'interface graphique du navigateur SQLite. C'est peut-être ce qui bloque votre base de données.

0
répondu jacurtis 2016-01-20 19:05:09

j'ai eu le même problème. Pour ceux avec le navigateur de base de données SQLite. Je n'avais pas besoin de fermer le navigateur de base de données SQLite. Je n'avais qu'à cliquer sur "Écrire les Changements". Elle est mise en évidence et ne doit pas l'être.

0
répondu jesse lawson 2016-10-02 21:13:58

SQLite a des problèmes avec la concurrence. J'ai changé de sqlite, Postgresql et le problème a disparu

0
répondu itsnikolay 2016-10-07 08:33:54

cela se produit lorsque vous apportez des modifications manuellement directement dans le navigateur SQLite DB (comme supprimer une ligne ou changer la valeur d'une colonne) et que vous oubliez de sauvegarder ces modifications. Toute modification doit être sauvegardée ( ctrl + s ). Si elle n'est pas sauvegardée, SQLite verrouille la base de données jusqu'à ce que vous sauvegardiez ces modifications.

j'ai fait la même chose et mon problème a été résolu!

0
répondu Shubham Aggarwal 2017-03-04 13:17:54

mon problème est: j'ai ouvert un programme de gestion de base de données appelé "DB Browser for SQlite". Fermé ce programme de gestion de base de données, et Problème résolu.

0
répondu hofffman 2017-07-30 02:23:35

J'utilisais navigateur DB pour SQLite et console rails simultanément. Fermer le DB Browser for SQLite a réglé le problème pour moi.

0
répondu webster 2018-01-03 05:58:04

essayez de redémarrer le serveur ou la fermeture de toute console de rails de roulement, a travaillé pour moi

0
répondu Aishwarya Singhal 2018-03-27 11:11:16