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

Martin Carney Points 1390

Cette exception se produit souvent lorsque vous essayez d'effectuer une opération d'écriture tout en conservant des ressources pour une opération de lecture. Par exemple, si vous SÉLECTIONNEZ dans une table, puis essayez de METTRE À JOUR quelque chose que vous avez sélectionné sans fermer votre ResultSet d'abord.

1voto

Stijn Sanders Points 10468

J'avais également des erreurs de type "base de données verrouillée" dans une application multithread, ce qui semble être le problème. SQLITE_BUSY et j'ai résolu le problème en définissant le code de résultat suivant sqlite3_busy_timeout à quelque chose de suffisamment long comme 30000.

(Soit dit en passant, il est étrange que personne n'ait déjà découvert cela sur une question vieille de 7 ans ! SQLite est vraiment un projet particulier et étonnant...)

1voto

kothvandir Points 816

Une vieille question, avec beaucoup de réponses, voici les étapes que j'ai suivies récemment en lisant les réponses ci-dessus, mais dans mon cas, le problème était dû au partage des ressources cifs. Ce cas n'est pas signalé précédemment, donc j'espère que cela aidera quelqu'un.

  • Vérifiez qu'aucune connexion n'est laissée ouverte dans votre code Java.
  • Vérifiez qu'aucun autre processus n'utilise votre fichier db SQLite avec lsof.
  • Vérifiez que l'utilisateur propriétaire de votre processus jvm en cours d'exécution a des permissions r/w sur le fichier.
  • Essayez de forcer le mode de verrouillage de l'ouverture de la connexion avec

    final SQLiteConfig config = new SQLiteConfig();
    
    config.setReadOnly(false);
    
    config.setLockingMode(LockingMode.NORMAL);
    
    connection = DriverManager.getConnection(url, config.toProperties());

Si vous utilisez votre fichier db SQLite sur un dossier partagé NFS, vérifiez ce point de la faq SQLite, et revoyez vos options de configuration de montage pour vous assurer que vous évitez les verrous, comme décrit ici :

//myserver /mymount cifs username=*****,password=*****,iocharset=utf8,sec=ntlm,file,nolock,file_mode=0700,dir_mode=0700,uid=0500,gid=0500 0 0

1voto

ederribeiro Points 62

J'ai obtenu cette erreur dans un scénario un peu différent de ceux décrits ici.

La base de données SQLite reposait sur un système de fichiers NFS partagé par 3 serveurs. Sur 2 des serveurs, j'ai pu exécuter des requêtes sur la base de données avec succès, sur le troisième j'ai reçu le message "database is locked".

Le problème avec cette 3ème machine, c'est qu'il ne restait plus d'espace sur /var . Chaque fois que j'ai essayé d'exécuter une requête dans N'IMPORTE QUELLE base de données SQLite située dans ce système de fichiers, j'ai obtenu le message "database is locked" (la base de données est verrouillée) et aussi cette erreur dans les journaux :

Aug 8 10:33:38 server01 kernel : lockd : cannot monitor 172.22.84.87

Et celui-ci aussi :

Aug 8 10:33:38 server01 rpc.statd [7430] : Failed to insert : writing /var/lib/nfs/statd/sm/other.server.name.com : Il ne reste plus d'espace sur le périphérique Août 8 10:33:38 server01 rpc.statd[7430] : STAT_FAIL à server01 pour SM_MON de 172.22.84.87

Après avoir géré la situation de l'espace, tout est revenu à la normale.

1voto

BobStein-VisiBone Points 398

Si vous essayez de déverrouiller le Base de données Chrome a le visualiser avec SQLite puis fermez simplement Chrome.

Windows

%userprofile%\Local Settings\Application Data\Google\Chrome\User Data\Default\Web Data

or

%userprofile%\Local Settings\Application Data\Google\Chrome\User Data\Default\Chrome Web Data

Mac

~/Library/Application Support/Google/Chrome/Default/Web Data

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