295 votes

Comment déverrouiller une base de données SQLite ?

sqlite> DELETE FROM mails WHERE (`id` = 71);
SQL error: database is locked

Comment puis-je déverrouiller la base de données pour que cela fonctionne ?

0 votes

Il se peut qu'un autre processus accède au fichier de la base de données - avez-vous vérifié lsof ?

0 votes

J'ai eu le même problème, le problème était dans l'antivirus quand je le désactive mon application fonctionne bien, mais quand je l'active je trouve l'erreur "la base de données est verrouillée", j'espère que cela va vous aider.

1voto

Siwei Shen Points 5814

D'après mon expérience, cette erreur est causée par : Vous avez ouvert plusieurs connexions.

Par exemple :

  1. 1 ou plusieurs sqlitebrowser (GUI)
  2. 1 ou plusieurs fils d'électrons
  3. fil des rails

Je ne suis pas sûr des détails de SQLITE3 sur la façon de gérer les multiples threads/demandes, mais quand je ferme le sqlitebrowser et le thread electron, alors rails fonctionne bien et ne bloque plus.

0voto

Dans vos commentaires précédents, vous avez dit qu'un fichier -journal était présent.

Cela pourrait signifier que vous avez ouvert une transaction (EXCLUSIVE ?) et que vous n'avez pas encore validé les données. Votre programme ou un autre processus a-t-il laissé le -journal derrière lui ?

Le redémarrage du processus sqlite examinera le fichier journal et nettoiera toutes les actions non engagées et supprimera le fichier -journal.

0voto

wisty Points 4280

Comme l'a dit Seun Osewa, il arrive qu'un processus zombie reste dans le terminal avec un verrou acquis, même si vous ne pensez pas que cela soit possible. Votre script s'exécute, se plante, et vous retournez au prompt, mais il y a un processus zombie engendré quelque part par un appel de bibliothèque, et ce processus a le verrou.

Fermer le terminal dans lequel vous étiez (sous OSX) peut fonctionner. Redémarrer fonctionnera. Vous pouvez rechercher les processus "python" (par exemple) qui ne font rien, et les tuer.

0voto

nXqd Points 2805

Vous pouvez essayer ceci : .timeout 100 pour définir le délai d'attente. Je ne sais pas ce qui se passe en ligne de commande mais en C# .Net lorsque je fais cela : "UPDATE table-name SET column-name = value;" Je comprends que la base de données est verrouillée mais cette "UPDATE table-name SET column-name = value" ça va bien.

Il semble que lorsque vous ajoutez ;, sqlite va chercher une autre commande.

0voto

TheSteven Points 458

J'ai obtenu cette erreur en utilisant Delphi avec les composants LiteDAC. Il s'est avéré que cela ne se produisait qu'en exécutant mon application depuis l'IDE Delphi si la propriété Connected était définie sur True pour le composant de connexion SQLite (dans ce cas TLiteConnection).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X