Pergunta

Meu SQLiteAtualmente, o aplicativo baseado em CAD usa transações - tanto para poder reverter quanto para melhorar o desempenho.Estou pensando em substituir todas as transações por pontos de salvamento.A razão é que o aplicativo é multithread (sim, sqlite está configurado para ser thread-safe) e, em alguns casos, uma transação pode ser iniciada por dois threads ao mesmo tempo (no mesmo banco de dados).

  1. Existe uma razão para NÃO fazer isso?
  2. Há alguma armadilha da qual preciso estar ciente?
  3. Eu apenas substituo BEGIN, COMMIT, ROLLBACK com SAVEPOINT xyz, RELEASE SAVEPOINT xyz, ROLLBACK TO SAVEPOINT xyz?
Foi útil?

Solução

    It there a reason NOT to do it?

Sim.Isso não resolverá nenhum dos problemas que você descreveu.Os pontos de salvamento são usados ​​principalmente para fazer reversões parciais de dados.A transação externa ou ponto de salvamento é o que realmente é confirmado.Nada é totalmente salvo até que o ponto de salvamento mais externo seja liberado, atualizando assim o banco de dados.Você está de volta ao mesmo problema que teve com as transações padrão.

    Are there any pitfalls I need to be aware of?

Sim.Transações ou pontos de salvamento em um aplicativo multithread podem travar facilmente se você atualizar os mesmos dados em dois threads diferentes, o que presumo ser o cerne da questão.Não há diferença entre os dois neste aspecto.Você deve estar ciente do que está atualizando em cada thread e sincronizar de acordo.

Resumindo, a menos que você precise fazer uma reversão parcial da transação, os pontos de salvamento realmente não lhe darão muito (além do fato de serem nomeados).

Não há solução mágica aqui.Parece que você precisa fazer uma análise séria do seu aplicativo e dos dados que podem ser atualizados em vários threads e adicionar alguma sincronização no seu aplicativo, se necessário.

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