AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 345265
Accepted
Alex
Alex
Asked: 2025-02-13 21:10:09 +0800 CST2025-02-13 21:10:09 +0800 CST 2025-02-13 21:10:09 +0800 CST

Transação Sqlite não liberada quando há outros leitores no banco de dados

  • 772

Se eu tiver vários leitores de banco de dados, que são basicamente instâncias do SQLite que abrem o arquivo db no modo "leitura", é normal que um único gravador que abre o db no modo "criação" não consiga liberar uma transação até que todos os leitores fechem o banco de dados?

Estou tentando descobrir se é um comportamento normal do sqlite ou um bug/limitação de uma biblioteca sqlite específica que estou usando.

Não entendo por que um escritor precisaria esperar que os leitores parassem de usar o arquivo de banco de dados. Não faz sentido para mim, porque os leitores não podem alterar os dados.

sqlite
  • 3 3 respostas
  • 39 Views

3 respostas

  • Voted
  1. Best Answer
    White Owl
    2025-02-17T08:30:04+08:002025-02-17T08:30:04+08:00

    Não. Não é normal que seu redator não possa liberar uma transação até que todos os leitores saiam do banco de dados.

    Isso levanta uma questão: como abrir o arquivo de banco de dados?

    O mecanismo sqlite tem a capacidade de abrir o banco de dados no modo somente leitura: https://www.sqlite.org/c3ref/open.html

    sqlite3 *db;
    sqlite3_open_v2("mydb.dat", &db, SQLITE_OPEN_READONLY, NULL);
    

    Os sinalizadores padrão (terceiro parâmetro), no entanto, são SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE.

    Se você tiver um aplicativo abrindo arquivo em normal SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE. E vários aplicativos abrindo em SQLITE_OPEN_READONLYmodo , então o writer não deve esperar pelos leitores. Ele nem saberá sobre eles.

    Se puder, tente fazer suas consultas com sqlite3a ferramenta console. Ela tem uma --readonlyopção que realmente abrirá o arquivo de banco de dados em modo somente leitura.

    Entretanto, se você não estiver trabalhando em C, mas em alguma vinculação de linguagem, pode ser que o arquivo seja sempre aberto normalmente e depois alternado para o modo somente leitura no nível de vinculação.


    De um ponto de vista formal, a selectdeclaração pode colocar um bloqueio em um esquema de tabela, de modo que um usuário não pode fazer alter tableenquanto outro usuário está selecionando a partir dele. Mas é o único bloqueio real que o leitor pode colocar em uma tabela.

    O único bloqueio que ele sqlitefaz no modo somente leitura é impedir que o arquivo do banco de dados seja excluído.


    Também pode ser bom ler sobre o modo de cache compartilhado: https://www.sqlite.org/sharedcache.html O que pode ser feito em alguns casos e também tem a capacidade de interferir nas transações se elas forem baseadas no mesmo cache.

    • 1
  2. Mike Sherrill 'Cat Recall'
    2025-02-14T00:24:41+08:002025-02-14T00:24:41+08:00

    Não entendo por que um escritor precisaria esperar que os leitores parassem de usar o arquivo de banco de dados

    Porque cada transação do SQLite — implícita ou explícita — bloqueia o arquivo de banco de dados.

    Nenhuma leitura ou gravação ocorre, exceto dentro de uma transação. Transações

    Você pode testar isso executando o SQLite3 em duas sessões de terminal diferentes conectando-se ao mesmo arquivo de banco de dados SQLite. O comportamento exato depende de vários detalhes, especialmente da opção " Write-Ahead Logging " (WAL). Novamente, veja Transactions

    Os escritores não "liberam" transações; eles ou fazem commit ou rollback. Se um escritor tenta fazer commit de uma instrução insert, por exemplo, e outro processo tem uma transação select aberta--ou seja, está "lendo o banco de dados"--o escritor obtém esse erro na minha máquina.

    [snip]
    sqlite> commit;
    Error: stepping, database is locked (5)
    
    • 0
  3. J.D.
    2025-02-14T01:18:40+08:002025-02-14T01:18:40+08:00

    Além do que Mike disse, em relação aos seus pensamentos sobre:

    Não entendo por que um escritor precisaria esperar que os leitores parassem de usar o arquivo de banco de dados. Não faz sentido para mim, porque os leitores não podem alterar os dados.

    Claro, mas os escritores alteram o banco de dados e, se um leitor estiver lendo dados e alterar alguns desses dados, resultados inesperados serão possíveis para os leitores.

    Por exemplo, se a consulta de leitura estiver no meio da varredura de cada linha em um índice, faria sentido para um escritor que deseja atualizar um valor de chave que mudaria a posição de uma linha naquele índice ter que esperar até que o leitor termine de varrer o índice. Caso contrário, é possível que o leitor releia a mesma linha de dados duas vezes, retornando resultados imprecisos. Isso seria conhecido como uma leitura não repetível.

    Outro problema que pode ocorrer é um ready sujo, em que o leitor ainda não terminou de escanear o índice, um escritor faz uma alteração em uma linha, o leitor então lê essa linha e a transação do escritor é revertida (desfeita/não confirmada), resultando em dados lidos pelo leitor que nunca foram salvos no banco de dados, causando imprecisões.

    Esses exemplos muito simplificados são algumas das razões pelas quais os leitores geralmente bloqueiam escritores, além de escritores também bloquearem leitores. Há um conceito de níveis de isolamento e simultaneidade otimista que permite que escritores e leitores não bloqueiem um ao outro ao operar simultaneamente nos mesmos dados. Mas a capacidade de usar esses recursos varia na implementação de cada sistema de banco de dados, e não tenho certeza se o SQLite oferece um recurso para isso.

    • 0

relate perguntas

  • Quantas buscas de disco são necessárias para gravar uma linha no SQLite?

  • Existe uma adição de software livre para SQLite disponível para replicação de dados? [fechado]

  • Usando CoreData em um aplicativo do lado do cliente

  • Limites do SQLite

  • É possível usar o SQLite como um banco de dados cliente-servidor? [fechado]

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve