Por que escritas simultâneas não são permitidas em um banco de dados SQLite?

72

Estou fazendo programação de banco de dados usando Java com SQLite.

Descobri que apenas uma conexão por vez para o banco de dados possui recursos de gravação, enquanto muitas conexões ao mesmo tempo possuem capacidade de leitura.

Por que a arquitetura do SQLite foi projetada assim? Contanto que as duas coisas que estão sendo escritas não estejam sendo escritas no mesmo lugar no banco de dados, por que duas gravações não podem ocorrer ao mesmo tempo?

    
por SteelToe 19.01.2017 / 21:18
fonte

2 respostas

152

Como "várias gravações simultâneas" é muito mais difícil de realizar no mecanismo de banco de dados principal do que o de um único gravador e vários leitores. Está além dos parâmetros de design do SQLite, e incluí-lo provavelmente subverteria o tamanho e a simplicidade deliciosamente pequenos do SQLite.

Suportar altos graus de simultaneidade de gravação é uma característica dos grandes mecanismos de banco de dados, como DB2, Oracle, SQL Server, MySQL, PostgreSQL, NonStop SQL e Sybase. Mas é tecnicamente difícil de realizar, exigindo amplo controle de simultaneidade e estratégias de otimização, como banco de dados, tabela e bloqueio de linha ou, em implementações mais modernas, controle de concorrência multi-versão . A pesquisa sobre este problema / exigência é volumosa e remonta a décadas .

O SQLite tem uma filosofia de design muito diferente da maioria dos DBMSs centrados no servidor que suportam vários escritores. Ele foi projetado para trazer o poder do SQL e do modelo relacional para aplicativos individuais e, na verdade, para ser incorporado em cada aplicativo. Esse objetivo requer trocas significativas. Não adicionar a infra-estrutura significativa e a sobrecarga necessárias para lidar com vários escritores simultâneos é uma delas.

A filosofia pode ser resumida por uma declaração em uso adequado do SQLite : p>

SQLite does not compete with client/server databases. SQLite competes with fopen().

    
por 19.01.2017 / 22:00
fonte
11

Porque não há servidor que possa dizer se as coisas devem ser escritas no mesmo lugar ou não. Existem apenas dois processos tentando gravar em um arquivo.

Como apontado em um comentário, as gravações simultâneas também podem ser suportadas por um encadeamento interno. Não tenho certeza de como isso funcionaria (também não pensei muito sobre isso). De qualquer forma aqui é porque o SQLite não usa threads: Dr Hipp acha que os threads são maus.

O fato de o DR Hipp achar que os tópicos são malignos está documentado na FAQ do SQLite .

    
por 19.01.2017 / 21:51
fonte