Ho un'applicazione multithread che utilizza SQLite (3.7.3)Evitare di database sqlite3 bloccato
Mi colpisce l'errore bloccato database che sembra essere abbastanza diffuso. Mi chiedo come evitarlo nel mio caso.
Lasciatemi descrivere cosa sto costruendo. Spiacente, nessun codice è troppo grande e complesso.
Ho circa 8 thread che accedono contemporaneamente al database. Ognuno di questi thread può leggere o scrivere allo stesso tempo.
Ogni riga di una tabella nel database ha un percorso file che punta a una risorsa + altri attributi relativi a tale risorsa.
3 campi di nota sono lettori, stato e del.
lettori viene incrementato ogni volta che un thread legge dalla risorsa, ma solo se lo stato> 0 e del = 0.
Così ho un po 'di SQL che fa
UPDATE resource set readers=readers+1 where id=? AND del=0 AND status>0
Dopo di che, ho il check il numero di righe aggiornate. Dovrebbe essere solo 1. Dopo che provo a leggere la riga indietro con una selezione. Lo faccio anche se non è riuscito ad aggiornare perché ho bisogno di sapere il motivo per cui è fallito.
Ho provato a includere sia l'aggiornamento sia la selezione in una transazione, ma questo non ha aiutato. Ho controllato che sto chiamando finalize anche sulle mie dichiarazioni.
Ora, ho pensato che serializzazione SQLite per impostazione predefinita. Ho provato un paio di modalità aperte ma ho ancora lo stesso errore.
E prima che tu lo chieda, no non intendo andare su mysql. Ho assolutamente bisogno di zero config.
Qualcuno può fornire alcuni suggerimenti su come evitare questo tipo di problema? dovrei spostare i lettori bloccati dal DB? Se lo faccio, con quale meccanismo dovrei sostituirlo? Sto usando Linux in C++ e con la libreria boost disponibile.
MODIFICA: È interessante notare che l'aggiunta di COMMIT dopo la mia chiamata aggiornata ha migliorato notevolmente le cose.
L'accettazione più frequente consente blocchi granulari ESCLUSIVI più dettagliati sul file di database, il che riduce il tempo di attesa dei lettori in attesa sul tavolo da sbloccare. Questo a spese del sovraccarico del file di giornale aumentato. Controlla http://sqlite.org/lockingv3.html#writing per maggiori informazioni. – checker