in

¿Cómo desbloqueo una base de datos SQLite?

Algunas funciones, como INDEX’ing, pueden llevar mucho tiempo y bloquean toda la base de datos mientras se ejecuta. En casos como ese, ¡es posible que ni siquiera use el archivo de diario!

Entonces, la mejor / única forma de verificar si su base de datos está bloqueada porque un proceso está escribiendo ACTIVAMENTE en ella (y, por lo tanto, debe dejarlo en paz hasta que complete su operación) es md5 (o md5sum en algunos sistemas) el archivo dos veces . Si obtiene una suma de comprobación diferente, la base de datos se está escribiendo, y realmente REALMENTE no quiere matar -9 ese proceso porque puede terminar fácilmente con una tabla / base de datos corrupta si lo hace.

Lo reiteraré, porque es importante, la solución NO es encontrar el programa de bloqueo y matarlo, es encontrar si la base de datos tiene un bloqueo de escritura por una buena razón, y partir de ahí. A veces, la solución correcta es solo una pausa para el café.

La única forma de crear esta situación de bloqueo pero no se está escribiendo es si su programa se ejecuta BEGIN EXCLUSIVE, porque quería hacer algunas alteraciones en la tabla o algo así, entonces, por alguna razón, nunca envía un END después, y el proceso nunca termina. Es muy poco probable que se cumplan las tres condiciones en cualquier código escrito correctamente y, como tal, 99 de cada 100 veces cuando alguien quiere matar -9 su proceso de bloqueo, el proceso de bloqueo en realidad está bloqueando su base de datos por una buena razón. Los programadores no suelen agregar BEGIN EXCLUSIVE condición a menos que realmente lo necesiten, ya que evita la concurrencia y aumenta las quejas de los usuarios. SQLite en sí solo lo agrega cuando realmente lo necesita (como cuando se indexa).

Finalmente, el estado ‘bloqueado’ no existe DENTRO del archivo como han indicado varias respuestas; reside en el kernel del sistema operativo. El proceso que se ejecutó BEGIN EXCLUSIVE ha solicitado al sistema operativo que se coloque un candado en el archivo. Incluso si su proceso exclusivo se ha bloqueado, su sistema operativo podrá determinar si debe mantener el bloqueo de archivos o no. ¡No es posible terminar con una base de datos que está bloqueada pero ningún proceso la está bloqueando activamente! Cuando se trata de ver qué proceso bloquea el archivo, generalmente es mejor usar lsof en lugar de fuser (esta es una buena demostración de por qué: https://unix.stackexchange.com/questions/94316/fuser-vs-lsof-to-check-files-in-use). Alternativamente, si tiene DTrace (OSX), puede usar iosnoop en el archivo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Método Java Thread resume () con ejemplos

Preguntas de la entrevista de servlet – javatpoint