Estou desenvolvendo um pequeno sistema com dois componentes: um pesquisa dados de um recurso da Internet e os converte em dados sql para persistir localmente; o segundo lê esses dados sql da instância local e os serve via json e uma API repousante.
Originalmente, eu estava planejando manter os dados com o postgresql, mas como o aplicativo terá um volume muito baixo de dados para armazenar e tráfego para servir, pensei que isso fosse um exagero. O SQLite está pronto para o trabalho? Adoro a idéia do tamanho reduzido e não há necessidade de manter outro servidor sql para essa tarefa, mas estou preocupado com a simultaneidade.
Parece que, com o log de gravação antecipada ativado, a leitura e gravação simultânea de um banco de dados SQLite podem ocorrer sem bloquear nenhum processo do banco de dados.
Uma única instância SQLite pode sustentar dois processos simultâneos acessando-a, se apenas uma lê e a outra grava? Comecei a escrever o código, mas queria saber se isso é uma aplicação incorreta do SQLite.
Respostas:
Você está procurando a documentação Bloqueio de arquivos e simultaneidade .
Os processos SQLite usam uma série de bloqueios para lidar com simultaneidade; para ler, vários processos podem obter um
SHARED
bloqueio.Um processo que grava precisará obter um
RESERVED
bloqueio e somente quando realmente for necessário liberar as alterações no disco, ele será movido para oPENDING
estado. Qualquer processo de leitura precisará desbloquear o arquivo, após o qual o processo de gravação poderá ser movidoEXCLUSIVE
para gravação no arquivo de banco de dados real.Como o processo do gravador só precisa bloquear o arquivo do banco de dados para gravações reais (liberações de memória, confirmações), uma configuração com apenas um leitor e apenas um gravador funcionará muito bem. Eu esperaria que ele funcionasse tão bem, se não melhor, como uma configuração com apenas um processo fazendo toda a leitura e escrita.
O SQLite é menos adequado quando você tem vários processos gravando frequentemente no mesmo banco de dados, pois a gravação exige a obtenção do
PENDING
bloqueio exclusivo para serializar as alterações.fonte
Só queria acompanhar e informar a todos que a implementação foi bem-sucedida. Trabalhar com SQLite foi um verdadeiro prazer e, com apenas um processo gravando por vez, nunca tivemos problemas com travamentos ... mesmo com leituras simultâneas muito rápidas de um processo secundário.
fonte