2012-01-20 17 views
5

el programa en el que estoy trabajando obtiene datos de un servicio web, agrega datos a la base de datos, elimina y actualiza. Pero a veces, cuando ejecuto mi aplicación, todas las acciones son exitosas, pero a veces cuando quiero agregar, borrar o actualizar datos obtengo este error.El archivo de base de datos está bloqueado

El servidor no pudo procesar la solicitud. ---> El archivo de base de datos de la base de datos está bloqueado está bloqueado

No puedo entender el mismo programa funciona bien en algún tiempo, pero en algún momento el programa da a este mensaje.

+0

¿Qué motor de base de datos está utilizando? ¿Has revisado los registros de la base de datos? –

+0

a qué base de datos se está conectando? MS Access .mdb o SQL Server? ¿También puedes mostrar la cadena de conexión? –

+0

Tendrá que proporcionar más detalles sobre qué base de datos está utilizando y cómo está accediendo a ella. –

Respuesta

5

SqlLite no permite que dos hilos utilicen la base de datos al mismo tiempo.

La forma más fácil de resolverlo es usar la instrucción lock en todas las llamadas a la base de datos.

+1

pero el problema es que tengo 4 de esas bases de datos en mi sitio web, todas las demás aplicaciones relacionadas funcionan bien, pero solo esta aplicación no funciona con el servicio web. No funcionar significa que a veces funciona y en algún momento la misma aplicación da el error que mencioné. –

+0

¿Ha intentado cargar la prueba de sus otros sitios? Ellos se encontrarán con el problema tarde o temprano. ¿Tal vez intente utilizar conexiones db múltiples para la misma solicitud HTTP en el servicio web? – jgauffin

3

¿Utiliza una base de datos basada en archivos como Access?

Archivo de base de datos siempre bloqueado (en casi todo el sistema de bases de datos), intente detener el servicio de la base de datos para desbloquear el archivo.

+0

Estoy usando el archivo de base de datos sqLite . ¿Cómo puede hacer un servicio web eso significa detener el desbloqueo del archivo? –

4

Existe un paquete excelente llamado SysInternals. uno de los componentes internos es Process Monitor (procmon). Úselo para verificar qué aplicación bloquea los archivos de su base de datos y si 2 instancias de su aplicación están "peleando" para obtener el bloqueo de los archivos DB.

En Sqlite, múltiples procesos pueden leer los archivos DB, pero solo uno puede hacer cambios (INSERTAR/ACTUALIZAR/ELIMINAR) en un momento determinado. si más de un proceso está tratando de cambiar el DB al mismo tiempo, obtendrá este error. puede usar Mutex para sincronizar entre los procesos que acceden al DB.

Por cierto, la documentación de sqlite recomienda evitar el uso de la base de datos desde múltiples hilos. para asegurarse de que solo un hilo accederá al DB al mismo tiempo, puede crear una clase estática que hará toda la interacción con la base de datos y usar un enunciado de bloqueo dentro de esta clase para evitar acceder al DB desde múltiples hilos simultáneamente.

Cuestiones relacionadas