Do FAQ 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. Porém, apenas um processo pode fazer alterações no banco de dados a qualquer momento.
Assim, tanto quanto eu entendo que eu posso: 1) Leia db de vários segmentos ( SELECT
) 2) Leia db de vários segmentos ( SELECT
) e escrever a partir único segmento ( CREATE
, INSERT
, DELETE
)
Mas li sobre o Write-Ahead Logging, que oferece mais simultaneidade, pois os leitores não bloqueiam os gravadores e um escritor não bloqueia os leitores . A leitura e a escrita podem prosseguir simultaneamente.
Finalmente, eu tenho completamente confuso quando eu descobri que , 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
estiver 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.- fcntl (3, a chamada F_SETLK no arquivo DB falha. Isso pode ser causado por um problema de bloqueio do NFS, por exemplo. Uma solução para esse problema é afastar o banco de dados e copiá-lo para que ele tenha um novo valor de Inode
Então, eu gostaria de esclarecer por mim mesmo, é necessário evitar o bloqueio? Posso ler e escrever ao mesmo tempo em dois threads diferentes? Obrigado.
isolation_level=None
. Sem o modo de cache compartilhado, como faço para compartilhar instâncias entre threads?