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.
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)')
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
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
Pronto era a versão do DBeaver que não estava ok. Instalei outra versão e rodou o SQLite. Simples assim!
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!