[SQLITE_BUSY]The database file is locked (databae is locked)

Anaísa Mayara Teodoro - Mar 15 - - Dev Community

Image description

Lidando com o erro SQL SQLITE_BUSY: o Arquivo do Banco de Dados está Bloqueado

Recentemente, ao trabalhar com SQLite em um projeto, deparei-me com um erro que me fez pensar por um tempo - "SQL Error: [SQLITE_BUSY] The database file is locked". Depois de algumas tentativas de resolução, gostaria de compartilhar como procedi para resolver esse problema com a criação simples de uma tabela.

O Problema

SQLite é um sistema de gerenciamento de banco de dados relacional extremamente leve e fácil de usar, perfeito para iniciantes em Python como eu. Ele não requer configurações complexas de servidor, sendo uma escolha ideal para projetos menores e aprendizado.

Entretanto, ao executar uma operação no banco de dados SQLite, via DBeaver em um notebook com a Distro Linux Ubuntu 20.04.6 LTS (Focal Fossa), deparei-me com o erro SQLITE_BUSY.

A mensagem de erro indicava que o arquivo do banco de dados estava bloqueado, o que me deixou confusa inicialmente, em função de que tanto no console, quanto executando via comandos sql no terminal, o SQLite funcionava normalmente menos no DBeaver.

Image description
Image description

Causas Possíveis

Após um pouco de pesquisa, notei que esse erro geralmente ocorre quando há múltiplas conexões tentando acessar ou modificar o banco de dados ao mesmo tempo. Isso pode acontecer em cenários de concorrência, onde uma conexão está escrevendo no banco de dados enquanto outra tenta acessá-lo.

Solução

Para resolver esse problema, considerei duas abordagens:

1. Espera e Tentativa

Uma solução simples é implementar uma lógica de espera e tentativa novamente. Isso pode ser feito implementando um loop que tenta executar a operação novamente após um curto período de espera.

import sqlite3
import time

def execute_query(query):
    while True:
        try:
            connection = sqlite3.connect('banco')
            cursor = connection.cursor()
            cursor.execute(query)
            connection.commit()
            connection.close()
            break
        except sqlite3.OperationalError as e:
            print("Operational Error:", e)
            print("Tentando novamente após 1 segundo...")
            time.sleep(1)

# Exemplo de uso:
execute_query('INSERT INTO usuario (id,nome,endereco,email,telefone) VALUES (30,"Beyoncé","Estados Unidos","beyonce@outlook.com",14255550103)')
Enter fullscreen mode Exit fullscreen mode

Fiz, mas nada mudou. Então, notei que poderia ser a versão do DBeaver que estava usando. Assim segui a ideia de instalar outra versão.

2. Desinstalar a versão do DBeaver que usas

Baseado na primeira tentativa, pesquisei tal issue no gitub da comunidade do DBeaver e desinstalei o DBeaver via snap com os seguintes comandos

snap remove dbeaver-ce
Enter fullscreen mode Exit fullscreen mode

E instalei utilizando o pacote .deb do site oficial

wget https://dbeaver.io/files/dbeaver-ce_latest_amd64.deb
sudo apt install ./dbeaver-ce_latest_amd64.deb
Enter fullscreen mode Exit fullscreen mode

Pronto era a versão do DBeaver que não estava ok. Instalei outra versão e rodou o SQLite. Simples assim!

Image description

Consideração de iniciante em SQLite e Python

Ao enfrentar o erro SQLITE_BUSY, é importante entender que ele geralmente ocorre devido a múltiplas conexões tentando acessar o banco de dados ao mesmo tempo.

Implementar estratégia como espera e tentativa novamente, reduzir o tempo de bloqueio e utilizar transações podem ajudar a mitigar esse problema, ou desinstalar a versão que estais utilizando.

Espero que essas duas dicas sejam úteis para aqueles que enfrentam esse mesmo erro. Se você tiver outras sugestões ou soluções alternativas, por favor, compartilhe nos comentários!

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .