Introduzione
SQLite usa un lock a livello di file per gestire l'accesso al file del database su disco. L'errore “database is locked” si verifica quando un processo cerca di accedere al database mentre un altro ci sta scrivendo. Può succedere in diversi scenari, ad esempio:
- Più applicazioni che accedono al database contemporaneamente.
- Transazioni lunghe che non eseguono commit o rollback in tempi brevi.
- Gestione scorretta delle connessioni al database e dei cursori.
Consiglio: quando indaghi su errori SQLite come
"database is locked", è utile aprire e ispezionare il database in modo visuale.Con un client SQL desktop come Beekeeper Studio puoi aprire il tuo file
.db, sfogliare le tabelle e rieseguire le query in modo interattivo per verificare che le modifiche funzionino.
Come risolvere l'errore
Soluzione 1: gestisci correttamente le transazioni
Una gestione scorretta delle transazioni porta spesso a un database bloccato. Assicurati che le transazioni si concludano rapidamente con un commit o un rollback, a seconda del caso.
Esempio:
BEGIN TRANSACTION;
-- Insert data into the table
INSERT INTO employees (name, position) VALUES ('John Doe', 'Software Engineer');
-- Commit the transaction
COMMIT;
Output previsto:
Nessun output, ma la transazione si completa correttamente senza bloccare il database.
Dopo il commit, è buona pratica verificare che il database accetti nuove scritture.
Lo screenshot qui sotto mostra una verifica simile in Beekeeper Studio: una INSERT seguita da una SELECT conferma che i nuovi dati (in questo caso, un record per “Maria Lopez”) sono stati scritti correttamente.

Soluzione 2: usa correttamente la connessione al database
Chiudi sempre correttamente la connessione al database al termine delle operazioni. Così eviti che il database resti bloccato inutilmente.
Esempio:
import sqlite3
from contextlib import closing
database_path = 'mydatabase.db'
with closing(sqlite3.connect(database_path)) as conn:
with closing(conn.cursor()) as cursor:
cursor.execute("INSERT INTO employees (name, position) VALUES (?, ?)", ('Jane Doe', 'Project Manager'))
conn.commit()
Output previsto:
Nessun output, ma l'inserimento viene eseguito senza bloccare il database e la connessione viene chiusa correttamente.
Se preferisci una GUI al codice, Beekeeper Studio apre e chiude automaticamente le connessioni SQLite ogni volta che esegui una query, riducendo il rischio di lasciare un database bloccato.
Soluzione 3: configura un timeout
Impostare un timeout può aiutare quando sono previsti accessi multipli. Indica a SQLite quanto attendere prima di restituire l'errore “database is locked”, dando al lock il tempo di essere rilasciato.
Esempio:
import sqlite3
conn = sqlite3.connect('mydatabase.db', timeout=10.0) # Set timeout to 10 seconds
cursor = conn.cursor()
try:
cursor.execute("INSERT INTO employees (name, position) VALUES (?, ?)", ('Sam Smith', 'Data Analyst'))
finally:
cursor.close()
conn.close()
Output previsto:
Nessun output, ma il timeout offre un margine per superare i lock temporanei.
Consiglio: in Beekeeper Studio puoi rieseguire una query fallita in precedenza con l'errore “database is locked” per verificare se un timeout o un nuovo tentativo hanno risolto il problema. È un modo rapido per testare le modifiche senza toccare il codice.
Soluzione 4: evita le transazioni lunghe
Mantieni le transazioni brevi per ridurre al minimo il tempo in cui il database resta bloccato. Così diminuisci la probabilità di incappare nell'errore “database is locked”.
Esempio:
BEGIN TRANSACTION;
INSERT INTO employees (name, position) VALUES ('Alice Johnson', 'HR Manager');
COMMIT;
Output previsto:
Nessun output, ma la transazione si completa rapidamente, riducendo la durata del lock.
Conclusione
L'errore “SQLite database is locked” è di solito il sintomo di problemi di concorrenza o di una cattiva gestione di connessioni e transazioni. Seguendo le best practice descritte sopra, cioè gestire le transazioni in modo efficiente, usare correttamente le connessioni, impostare timeout adeguati ed evitare transazioni lunghe, puoi prevenire questo errore. Queste strategie rendono le operazioni sul tuo database SQLite robuste ed efficienti.
Provalo tu stesso
Puoi aprire qualsiasi file .db in Beekeeper Studio per esplorare le tabelle, eseguire query e verificare che le modifiche siano applicate correttamente. È open source, si connette a più di 20 database e funziona perfettamente su Windows, macOS e Linux.
Beekeeper Studio è una GUI per database gratuita & open source
Il miglior strumento per query & editor SQL che abbia mai usato. Offre tutto ciò che mi serve per gestire il mio database. - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studio è veloce, intuitivo e facile da usare. Beekeeper supporta tantissimi database e funziona alla grande su Windows, Mac e Linux.
Cosa dicono gli utenti di Beekeeper Studio
"Beekeeper Studio ha sostituito completamente il mio vecchio workflow SQL. È veloce, intuitivo e rende di nuovo piacevole lavorare con i database."
"Ho provato molte GUI per database, ma Beekeeper trova l'equilibrio perfetto tra funzionalità e semplicità. Funziona e basta."