2008-12-18 22 views
7

Me encontré con un problema extraño sobre sqlite3. Obtuve diferentes conexiones del mismo archivo de base de datos usando el método open(). la conexión 1 comienza una transacción, y la conexión 2 comienza otra transacción, que es actualizar varios registros de una tabla. Luego, la conexión 1 confirma la transacción, y luego la conexión 2 confirma su transacción. Pero descubrí que el comando de actualización de la conexión 2 en realidad nunca actualiza el registro en la base de datos. No hay excepción lanzada durante este procedimiento. No sé por qué ocurre el problema. ¿Alguien puede explicarme la razón?¿Pueden las diferentes conexiones de la misma base de datos sqlite comenzar transacciones al mismo tiempo?

Respuesta

14

Si lee la documentación de SQLite, verá que admite múltiples conexiones para lectura solamente, no puede escribir en la base de datos desde conexiones múltiples, porque no está diseñado para eso.

http://www.sqlite.org/faq.html#q5

+1

Sin embargo, puede tener dos transacciones de escritura simultáneas, que es lo que está causando el problema. –

+0

Entonces, si hay una transacción que está realizando una operación de escritura en la base de datos, cualquier otra operación de escritura no puede modificar la base de datos, sin importar si estas operaciones están dentro de una transacción o no. – user26404

+0

¿Puedo hacer una operación de selección cuando hay otra conexión que realiza una operación de escritura (insertar, actualizar) al mismo tiempo? – user26404

5

A menos que utilice COMENZAR inmediatas para iniciar sus operaciones, se corre el riesgo de tener que deshacer y volver a intentar ellos. A BEGIN no hace ningún bloqueo; UPDATE o INSERT subsiguientes obtiene el bloqueo, y debe verificar el código de resultado para ver si falla. Consulte esta página en transactions y esta en locks.

Cuestiones relacionadas