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 ?
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 ?
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.
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...)
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.
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
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.
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 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.
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.