SQLITE - Como posso lidar com a contenção potencial entre dois threads separados acessando o mesmo banco de dados?

StackOverflow https://stackoverflow.com/questions/2490432

  •  21-09-2019
  •  | 
  •  

Pergunta

Pergunta: Como posso lidar com a contenção potencial entre dois threads separados acessando o mesmo banco de dados SQLite?

Antecedentes: Eu tenho um aplicativo C# WinForms que usa o SQLite via ADO.NET. Eu tenho um encadeamento de BackgroundWorker no aplicativo Winforms. Percebi que posso obter uma exceção quando o tópico principal e o tópico do trabalhador em segundo plano tentam atualizar o banco de dados sqlite, ou seja, chamando um dbdataadaptor.update () ..

Então, estou interessado em que verifica meu código (embora o código de encadeamento principal e/ou código que seja executado no BackgroundWorker) para lidar com isso graciosamente, por uma maneira de verificar com antecedência, ou bloquear até ok, ou levantando um erro específico que posso pegar ...

obrigado

Foi útil?

Solução

No sqlite, você pode configurar um retorno de chamada que é acionado quando encontrar um SQLITE_BUSY ou SQLITE_IOERR_BLOCKED erro (veja http://www.sqlite.org/c3ref/busy_handler.html).

Como na maioria das vezes, o que você deseja fazer é dormir e tentar novamente a consulta em ocupado, o SQLite tem um retorno de chamada embutido que faz exatamente isso; Leia sobre sqlite3_busy_timeout no http://www.sqlite.org/c3ref/busy_timeout.html.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top