Escritura concurrente con sqlite3

Estoy usando el módulo .db sqlite3 para escribir los resultados de los trabajos por lotes en un archivo .db común. Elegí SQLite porque varios procesos pueden intentar escribir al mismo tiempo, y como lo entiendo, SQLite debería manejar esto bien. De lo que no estoy seguro es de lo que sucede cuando varios procesos finalizan e intentan escribir al mismo tiempo. Así que si varios procesos se ven así

 conn = connect('test.db') with conn: for v in xrange(10): tup = (str(v), v) conn.execute("insert into sometable values (?,?)", tup) 

ejecutan a la vez, van a lanzar una excepción? Espera cortésmente a que escriban los otros procesos? ¿Hay alguna manera mejor de hacer esto?

La biblioteca sqlite bloqueará la base de datos por proceso al escribir en la base de datos y cada proceso esperará a que se libere el locking para obtener su turno.

Sin embargo, la base de datos no necesita escribirse hasta el momento de la confirmación . Está utilizando la conexión como administrador de contexto (¡bien!), Por lo que la confirmación se realiza después de que se complete su bucle y se hayan ejecutado todas las instrucciones de insert .

Si su base de datos tiene restricciones de exclusividad, es posible que la confirmación falle porque un proceso ya ha agregado filas con las que otro proceso entra en conflicto.

Si cada proceso mantiene su propia conexión, entonces debería estar bien. Lo que sucederá es que al escribir el proceso se bloqueará la base de datos, por lo que el rest del proceso se bloqueará. Lanzarán una excepción si se excede el tiempo de espera para esperar que el DB esté libre. El tiempo de espera se puede configurar a través de la llamada de conexión:

http://docs.python.org/2/library/sqlite3.html#sqlite3.connect

No se recomienda que tenga su archivo DB en un recurso compartido de red.

Actualizar:

También puede consultar el nivel de aislamiento: http://docs.python.org/2/library/sqlite3.html#sqlite3.Connection.isolation_level

La buena noticia es que la biblioteca SQLLite utiliza implícitamente una transacción que bloquea una base de datos cada vez que ejecuta un DML. Esto significa que otros accesos concurrentes a la base de datos esperarán hasta que la solicitud DML en ejecución se complete al cometer / deshacer una transacción. Sin embargo, tenga en cuenta que varios procesos pueden realizar SELECT al mismo tiempo.

Además, consulte el módulo Python SQL Lite 3.0 en la sección 11.13.6 – Control de transacciones que detalla cómo se pueden controlar las transacciones.