How do I unlock a SQLite database?

前端 未结 30 1387
栀梦
栀梦 2020-11-22 15:56
sqlite> DELETE FROM mails WHERE (`id` = 71);
SQL error: database is locked

How do I unlock the database so this will work?

相关标签:
30条回答
  • 2020-11-22 16:29

    An old question, with a lot of answers, here's the steps I've recently followed reading the answers above, but in my case the problem was due to cifs resource sharing. This case is not reported previously, so hope it helps someone.

    • Check no connections are left open in your java code.
    • Check no other processes are using your SQLite db file with lsof.
    • Check the user owner of your running jvm process has r/w permissions over the file.
    • Try to force the lock mode on the connection opening with

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

    If your using your SQLite db file over a NFS shared folder, check this point of the SQLite faq, and review your mounting configuration options to make sure your avoiding locks, as described here:

    //myserver /mymount cifs username=*****,password=*****,iocharset=utf8,sec=ntlm,file,nolock,file_mode=0700,dir_mode=0700,uid=0500,gid=0500 0 0
    
    0 讨论(0)
  • 2020-11-22 16:30

    The DatabaseIsLocked page listed below is no longer available. The File Locking And Concurrency page describes changes related to file locking introduced in v3 and may be useful for future readers. https://www.sqlite.org/lockingv3.html

    The SQLite wiki DatabaseIsLocked page offers a good explanation of this error message. It states, in part, that the source of contention is internal (to the process emitting the error).

    What this page doesn't explain is how SQLite decides that something in your process holds a lock and what conditions could lead to a false positive.

    0 讨论(0)
  • 2020-11-22 16:30

    Before going down the reboot option, it is worthwhile to see if you can find the user of the sqlite database.

    On Linux, one can employ fuser to this end:

    $ fuser database.db
    
    $ fuser database.db-journal
    

    In my case I got the following response:

    philip    3556  4700  0 10:24 pts/3    00:00:01 /usr/bin/python manage.py shell
    

    Which showed that I had another Python program with pid 3556 (manage.py) using the database.

    0 讨论(0)
  • 2020-11-22 16:30

    you can try this: .timeout 100 to set timeout . I don't know what happen in command line but in C# .Net when I do this: "UPDATE table-name SET column-name = value;" I get Database is locked but this "UPDATE table-name SET column-name = value" it goes fine.

    It looks like when you add ;, sqlite'll look for further command.

    0 讨论(0)
  • 2020-11-22 16:31

    I have such problem within the app, which access to SQLite from 2 connections - one was read-only and second for writing and reading. It looks like that read-only connection blocked writing from second connection. Finally, it is turns out that it is required to finalize or, at least, reset prepared statements IMMEDIATELY after use. Until prepared statement is opened, it caused to database was blocked for writing.

    DON'T FORGET CALL:

    sqlite_reset(xxx);
    

    or

    sqlite_finalize(xxx);
    
    0 讨论(0)
  • 2020-11-22 16:31

    I just had something similar happen to me - my web application was able to read from the database, but could not perform any inserts or updates. A reboot of Apache solved the issue at least temporarily.

    It'd be nice, however, to be able to track down the root cause.

    0 讨论(0)
提交回复
热议问题