Diciamo che ci sono due script python che vogliono scrivere dati nella stessa tabella che è memorizzata in un file SQLite usando il modulo sqlite3
. Il file SQLite è memorizzato su un filesystem NFS. Nel numero SQLite-FAQ ho letto:È possibile bloccare il file sqlite sul filesystem NFS?
SQLite utilizza i blocchi lettore/scrittore per controllare l'accesso al database. [...] Attenzione però: questo meccanismo di blocco potrebbe non funzionare correttamente se il file di database è conservato su un filesystem NFS. Questo perché il blocco del file fcntl() è danneggiato in molte implementazioni NFS. Si dovrebbe evitare di inserire file di database SQLite su NFS se più processi potrebbero provare ad accedere al file nello stesso momento.
Ciò significa che non è possibile o esiste un modo per garantire che un processo attenda fino a quando l'altro non viene eseguito?
Gli INSERT non sono complessi. Solo alcuni:
INSERT_STATEMENT = "INSERT INTO some_table (row, col, val) VALUES (?, ?, ?)"
connection.executemany(INSERT_STATEMENT, triples)
E i set inseriti sono disgiunti.
Un'ulteriore domanda: i problemi NFS si verificano quando due processi tentano di scrivere sulla stessa tabella o quando provano a scrivere nello stesso database (che è un file)? Sarebbe una soluzione alternativa lasciare che ogni processo crei la propria tabella nello stesso database (file) e scrivere in quello?
Ascolta quest'uomo. [È un'autorità.] (Http://code.google.com/p/apsw/) –
Purtroppo devo usare SQLite. Alla fine ho dato a ciascun processo il proprio file per scrivere e unire gli script in seguito. Ma grazie per la tua risposta! :-) – Aufwind
Quando si arriva alla corruzione, assicurati di menzionare che hai usato NFS. E non essere sorpreso quando la risposta di tutti è "non farlo". –