python - multiple - ¿Es posible bloquear el archivo sqlite en el sistema de archivos NFS?
sqlite varchar max (1)
Digamos que hay dos scripts de Python que desean escribir datos en la misma tabla que se almacena en un archivo SQLite utilizando el módulo sqlite3
. El archivo SQLite se almacena en un sistema de archivos NFS. En el SQLite-FAQ leo:
SQLite usa bloqueos lector / escritor para controlar el acceso a la base de datos. [...] Pero tenga cuidado: este mecanismo de bloqueo podría no funcionar correctamente si el archivo de la base de datos se mantiene en un sistema de archivos NFS. Esto se debe a que el bloqueo de archivos fcntl () se rompe en muchas implementaciones de NFS. Debe evitar colocar archivos de base de datos SQLite en NFS si varios procesos pueden intentar acceder al archivo al mismo tiempo.
¿Significa esto que no es posible en absoluto o hay alguna forma de garantizar que un proceso espere hasta que el otro termine?
Los INSERT no son complejos. Solo algunos:
INSERT_STATEMENT = "INSERT INTO some_table (row, col, val) VALUES (?, ?, ?)"
connection.executemany(INSERT_STATEMENT, triples)
Y los conjuntos insertados son disjuntos.
Una pregunta adicional: ¿Se producen los problemas NFS cuando dos procesos intentan escribir en la misma tabla o cuando intentan escribir en la misma base de datos (que es un archivo)? ¿Sería una solución dejar que cada proceso creara su propia tabla en la misma base de datos (archivo) y escribir en ella?
No use SQLite con NFS. Es tan simple como eso. La semántica de NFS es diferente de los sistemas de archivos normales y es más flexible. Eventualmente obtendrás corrupción. De vez en cuando, alguien en la lista de correo de los usuarios de SQLite publica sus "soluciones temporales". Nunca funcionan aunque parezcan a corto plazo.