Como evito bloqueios de banco de dados SQLite?

10

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 SELECTao 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 CREATEou DROPuma tabela ou índice enquanto uma SELECTinstrução ainda está pendente.
  • Tentando gravar em uma tabela enquanto a SELECTestiver ativo nessa mesma tabela.
  • Tentando fazer dois SELECTna 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.

Andrei Orlov
fonte

Respostas:

8

Essa página que você vinculou, além de ser bastante antiga, fala sobre acessos do mesmo processo através da mesma conexão com o banco de dados (ou através de conexões multiponto no modo de cache compartilhado , que você não deve usar).

Quando não está no modo WAL, várias conexões podem ler do mesmo banco de dados, mas uma transação de gravação é exclusiva, ou seja, nenhum outro leitor ou gravador é permitido.

No modo WAL, um escritor e leitores não se bloqueiam, mas ainda há apenas um escritor permitido.

CL.
fonte
11
O que há de errado com o modo de cache compartilhado? Consegui obter vários threads python no mesmo processo para gravar em uma tabela através de um loop Paralelo para joblb . Eu tive problemas de bloqueio até um set isolation_level=None. Sem o modo de cache compartilhado, como faço para compartilhar instâncias entre threads?
Justin Dearing 07/02
11
A documentação descreve as desvantagens. É especialmente perigoso se você não sabe como evitar conflitos.
CL.
Chegando muito tarde para a festa, mas esse link é útil. manski.net/2012/10/sqlite-performance
infocyde