De FAQ do SQLite, eu sabia que:
Vários processos podem ter o mesmo banco de dados aberto ao mesmo tempo. Vários processos podem estar fazendo um
SELECT
ao mesmo tempo. Mas apenas um processo pode fazer alterações no banco de dados a qualquer momento.
Então, até onde eu entendo eu posso: 1) Ler db de vários threads ( SELECT
) 2) Ler db de vários threads ( SELECT
) e escrever de um único thread ( CREATE
, INSERT
, DELETE
)
Mas, eu li sobre o Write-Ahead Logging que fornece mais simultaneidade, pois os leitores não bloqueiam os escritores e um escritor não bloqueia os leitores . A leitura e a escrita podem ocorrer simultaneamente.
Finalmente, fiquei completamente confuso quando o encontrei , quando especificado:
Aqui estão outros motivos para obter um erro SQLITE_LOCKED:
- Tentando
CREATE
ouDROP
uma tabela ou índice enquanto umaSELECT
instrução ainda está pendente.- Tentando gravar em uma tabela enquanto a
SELECT
está ativo nessa mesma tabela.- Tentando fazer dois
SELECT
na mesma tabela ao mesmo tempo em um aplicativo multithread, se o sqlite não estiver definido para isso.- A chamada fcntl(3,F_SETLK no arquivo DB falha. Isso pode ser causado por um problema de bloqueio NFS, por exemplo. Uma solução para esse problema é remover o banco de dados e copiá-lo de volta para que ele tenha um novo valor Inode
Então, gostaria de esclarecer para mim mesmo, é necessário evitar o bloqueio? Posso ler e escrever ao mesmo tempo em dois tópicos diferentes? Obrigado.
Essa página que você linkou, além de ser bem antiga, fala sobre acessos de um mesmo processo através da mesma conexão de banco de dados (ou através de conexões multipe em modo de cache compartilhado , que você não deve usar).
Quando não estiver no modo WAL, várias conexões podem ler do mesmo banco de dados, mas uma transação de escrita é exclusiva, ou seja, nenhum outro leitor ou gravador é permitido.
No modo WAL, um escritor e leitores não bloqueiam um ao outro, mas ainda há apenas um escritor permitido.