0 Questão: Bloqueando todo o banco de dados SQLite3 durante a atualização

pergunta criada em Wed, May 8, 2019 12:00 AM

Eu tenho que atualizar um banco de dados SQLite3, que irá soltar uma tabela, recriá-lo e, em seguida, preencher novamente a tabela. Eu quero garantir que todos os meus outros processos que acessam o banco de dados tenham que esperar que a transação seja concluída para evitar que ela esteja pronta em uma possível tabela vazia /ausente.

Neste ponto, meu código é assim:

PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
DROP TABLE IF EXISTS mytable;
CREATE TABLE mytable(key VARCHAR(256), value VARCHAR(256), PRIMARY KEY(key));
INSERT INTO "mytable" VALUES('key','value');
COMMIT

Enquanto isso funciona, não tenho certeza se estou realmente bloqueando o banco de dados. Eu encontrei algumas informações contraditórias on-line que mencionam "BEGIN TRANSACTION EXCLUSIVE" vs "BEGIN TRANSACTION".

Alguém pode explicar qual tipo de transação eu preciso para garantir que nenhuma outra leitura seja bem-sucedida enquanto estiver bloqueada?

    
- 1
  1. A questão é muito ampla porque a resposta depende quase inteiramente de suas circunstâncias específicas. Você está se conectando no modo WAL? O padrão ou exclusivo do LOCKING_MODE? SHARED_CACHE_MODE está habilitado? É o nível de isolamento de outras conexões "read uncommitted" ou não? Muitos detalhes.
    2019-05-08 17: 11: 09Z
  2. Na verdade, eu não sei nada sobre os outros processos (como eles são escritos). Eu estou tentando atualizar o banco de dados da linha de comando bash, usando um .sql eu criei. Eu quero garantir que os outros processos não se queixem de uma tabela ausente /vazia. Então eu quero que meu arquivo .sql bloqueie o banco de dados adequadamente
    2019-05-08 18: 08: 27Z
  3. Com as configurações normais, um bloqueio de gravação será adquirido para a tabela de recebimento e não liberado até a confirmação. Nenhuma outra conexão pode adquirir um bloqueio até então. Mas se você tiver várias conexões disputando regularmente os bloqueios de gravação, deverá usar um banco de dados diferente. Muitos leitores e, ocasionalmente, escritores, talvez o modo Wal.
    2019-05-08 18: 54: 32Z
  4. @ Shawn - esta atualização não é frequente, o que é ok. Eu não tenho controle sobre a instalação do SQLite (por isso não posso modificar configurações como o modo WAL). Então, eu estava esperando que houvesse uma resposta simples como usar "BEGIN TRANSACTION XXX"
    2019-05-09 00: 12: 19Z
0 Respostas                              0                         
fonte colocada Aqui