¿Cómo volver a intentar de forma segura la consulta opaca cuando sqlite3_exec devuelve SQLITE_BUSY?

Estoy ejecutando una consulta que se parece a esto:

ATTACH 'db2' as db;
BEGIN TRANSACTION; 
...
END TRANSACTION;

Tengo que hacerlo de esta manera porque es un error adjuntar en la transacción.

El problema parece ocurrir si otra conexión ya está ejecutando algún tipo de consulta cuando se emite la consulta anterior. Luego, toda la consulta parece fallar y devuelve SQLITE_BUSY.

Para manejar esto, duermo un rato y luego vuelvo a intentar la transacción. Sin embargo, ahora aparece el error "no se puede adjuntar la base de datos dentro de la transacción". ¿Por qué está pasando esto? ¿La conexión original tuvo éxito a pesar de devolver SQLITE_BUSY? Si es así, ¿por qué no obtuve "la base de datos db2 ya está en uso" en su lugar? ¿O la transacción anterior sigue abierta a pesar de que se devolvió SQLITE_BUSY? Eso no tiene sentido para mí, la consulta falló ocupada, por lo que la transacción nunca debería haberse abierto. Pero, ¿qué más podría ser?

En general, el programa que realiza la consulta no sabe cuál es la consulta, es solo una especie de contenedor. Entonces, no puedo hacer algo como dividir la consulta en dos partes, una para adjuntar la base de datos y la otra para realizar el resto de la consulta. Pero no estoy seguro si este es el problema de todos modos.

preguntado el 12 de junio de 12 a las 20:06

1 Respuestas

no me he dado cuenta exactamente el porqué esto está sucediendo, pero descubrí que una solución satisfactoria es llamar a sqlite3_close() seguido de sqlite3_open() después de que se devuelva SQLITE_BUSY. Esto elimina cualquier condición pendiente con la que podría tropezar un reintento de la consulta anterior.

Respondido el 12 de junio de 12 a las 21:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.