¿Qué problema indica?
Código SQLITE_BUSY · Problema informado por SQLite.
Explicación traducida
El código de resultado SQLITE_BUSY indica que el archivo de base de datos no se pudo escribir (o en algunos casos leer) debido a la actividad simultánea de alguna otra conexión de base de datos, generalmente una conexión de base de datos en un proceso separado.
Por ejemplo, si el proceso A está en medio de una transacción de escritura grande y al mismo tiempo el proceso B intenta iniciar una nueva transacción de escritura, el proceso B obtendrá un resultado SQLITE_BUSY porque SQLite solo admite un escritor a la vez. El proceso B deberá esperar a que el proceso A finalice su transacción antes de comenzar una nueva transacción. Las interfaces sqlite3_busy_timeout() y sqlite3_busy_handler() y el pragma ocupado_timeout están disponibles para procesar B para ayudarlo a lidiar con los errores SQLITE_BUSY.
Un error SQLITE_BUSY puede ocurrir en cualquier punto de una transacción: cuando la transacción se inicia por primera vez, durante cualquier operación de escritura o actualización, o cuando se confirma la transacción. Para evitar encontrar errores SQLITE_BUSY en medio de una transacción, la aplicación puede usar BEGIN IMMEDIATE en lugar de simplemente BEGIN para iniciar una transacción. El comando BEGIN IMMEDIATE podría devolver SQLITE_BUSY, pero si tiene éxito, SQLite garantiza que ninguna operación posterior en la misma base de datos hasta el siguiente COMMIT devolverá SQLITE_BUSY.
Ver también: SQLITE_BUSY_RECOVERY y SQLITE_BUSY_SNAPSHOT.
El código de resultado SQLITE_BUSY difiere de SQLITE_LOCKED en que SQLITE_BUSY indica un conflicto con una conexión de base de datos separada, probablemente en un proceso separado, mientras que SQLITE_LOCKED indica un conflicto dentro de la misma conexión de base de datos (o, a veces, una conexión de base de datos con un caché compartido).
Google Translate · Esta es una traducción automática. Consulte el original en inglés para comprobar los términos técnicos y las condiciones aplicables.
Explicación oficial · Texto original
The SQLITE_BUSY result code indicates that the database file could not be written (or in some cases read) because of concurrent activity by some other database connection, usually a database connection in a separate process.
For example, if process A is in the middle of a large write transaction and at the same time process B attempts to start a new write transaction, process B will get back an SQLITE_BUSY result because SQLite only supports one writer at a time. Process B will need to wait for process A to finish its transaction before starting a new transaction. The sqlite3_busy_timeout() and sqlite3_busy_handler() interfaces and the busy_timeout pragma are available to process B to help it deal with SQLITE_BUSY errors.
An SQLITE_BUSY error can occur at any point in a transaction: when the transaction is first started, during any write or update operations, or when the transaction commits. To avoid encountering SQLITE_BUSY errors in the middle of a transaction, the application can use BEGIN IMMEDIATE instead of just BEGIN to start a transaction. The BEGIN IMMEDIATE command might itself return SQLITE_BUSY, but if it succeeds, then SQLite guarantees that no subsequent operations on the same database through the next COMMIT will return SQLITE_BUSY.
See also: SQLITE_BUSY_RECOVERY and SQLITE_BUSY_SNAPSHOT.
The SQLITE_BUSY result code differs from SQLITE_LOCKED in that SQLITE_BUSY indicates a conflict with a separate database connection, probably in a separate process, whereas SQLITE_LOCKED indicates a conflict within the same database connection (or sometimes a database connection with a shared cache).