[Gfoss] Spatialite e Qspatialite: Messaggio di Errore sotto Debian Linux - SQL error. Database is locked

a.furieri a lqt.it a.furieri a lqt.it
Mer 27 Mar 2013 20:23:28 CET


On Wed, 27 Mar 2013 19:44:12 +0100, Luca Mandolesi wrote:
> Il database è usato da un solo utente e il problema si è presentato
> dopo aver provato ad aggiungere una tabella col plugin Qspatialite;
> pochi secondi prima ne avevamo aggiunte altre senza problemi.
>

se e' veramente come dici, allora sembrerebbe un problema tutto
interno al connector Python (pysqlite, oppure pyspatialite).
torna abbastanza bene; infatti io che non uso mai Python ma uso
direttamente le API C/C++ non ho mai visto nulla di simile.

nota bene: se usi pyspatialite erano gia' state sollevati numerosi
dubbi sulla sua effettiva stabilita', visto che pare che in molti casi
venga distribuita una versione che incorpora una "copia interna" di
libsqlite (possibilmente diversa dalla libsqlite di sistema).
non so darti ulteriori dettagli (pyspatialite, a dispetto del nome,
si basa su spatialite ma non e' "roba mia").
Ecluderei che questo possa accadere su Debian, visto che ha due 
packagers
"belli tosti" come Frankie e Dapal, che sono due vecchie rocce :-)


> Ho provato a seguire i comandi di recover usati nel link
> soprastante... e il database torna a funzionare con un nuovo nome 
> tipo
> recovered.db.
> Ora non ho modo di verificare il problema del log, domani verifico.
> Cmq pare che tutto sia strettamente legato al nome del file, dato che
> modificandolo torna a funzionare.
>

pare decisamente la conferma di un problema legato al logfile.
l'associazione tra db-file e log-file ovviamente avviene perche' hanno
nomi direttamente correlati.
se tu rinomini il db-file ottieni sostanzialmente lo stesso risultato 
come
se tu cancellassi il log-file; in ogni caso spezzi il legame tra i due,
perche' ovviamente verrà creato un ulteriore log-file "vergine" 
corrispondente
al nuovo nome, mentre l'altro verra' del tutto ignorato.


> Nonappena riuso il vecchio nome l'errore riappare.
>

direi che questo ci toglie anche gli ultimi dubbi residui, no ?
qualcosa di malefico e' sicuramente accaduto a quel disgraziato 
log-file :-)

giusto per completezza: non appena SQLite tenta di modificare il DB 
(INSERT,
UPDATE, DELETE, CREATE etc) col cavolo che va a scrivere direttamente 
nel
DB-file. non puo' farlo, perche' e' ACID e transazionale.
quindi tutte le modifiche vengono temporaneamente scritte nel log-file;
solo quando ti decidi ad eseguire una COMMIT, finalmente le modifiche 
vengono
consolidate definitivamente nel DB-file, ed il log-file verra' 
cancellato dato
che non serve piu' a nulla.

cosa succede se per qualche motivo il sistema si blocca all'improvviso 
mentre
hai una qualche transazione sospesa ?
(abort secco, p.es. caduta di alimentazione elettrica).

e' abbastanza ovvio: quando andrai a riaprire una nuva connessione, per 
prima
cosa SQLite andra' a verificare se esiste un log-file corrispondente.
e cerchera' di utilizzarlo per riportare comunque il db-file in uno 
stato
pienamente consistente.
se per qualsiasi motivo (come sta accadendo a te) SQLite non riesce a 
leggere
correttamente il log-file sei in stallo matto; la connessione non 
potra' mai
andare a buon fine, ed il problema diventera' perfettamente ciclico.

ciao Sandro

-- 
Il messaggio e' stato analizzato alla ricerca di virus o
contenuti pericolosi da MailScanner, ed e'
risultato non infetto.



Maggiori informazioni sulla lista Gfoss