SQLite3 e più processi

Come si dovrebbe garantire la correttezza quando più processi accedere a un singolo file di database SQLite?

  • Almeno si potrebbe avere tagged tua domanda con l’apposito linguaggio di programmazione.
  • Yeap, o specificare che avete bisogno di un linguaggio indipendente dalla piattaforma indipendente da tutto indipendente dal tipo di approccio.
  • Vorrei provare a chiedere di nuovo senza “mostra il codice”…
  • Mi dispiace, sono a casa ciechi… la lingua del Programma di scelta è il C/C++.
  • Questo è stato il mio primo post qui, mi si spera imparare a fare il tag appropriati da questo errore.
InformationsquelleAutor | 2009-06-30



4 Replies
  1. 15

    Evitare in primo luogo, l’accesso simultaneo a file di database sqlite. La concorrenza è uno dei sqlite punti deboli e se si dispone di un altamente concorrenti applicazione, è consigliabile utilizzare un altro motore di database.

    Se non è possibile evitare di concorrenza o drop sqlite, avvolgere il vostro scrivere transazioni in BEGIN IMMEDIATE;END;. L’impostazione predefinita, la modalità di transazione in sqlite è DEFERRED il che significa che un blocco viene acquisito solo sul primo vero tentativo di scrittura. Con IMMEDIATE operazioni, viene acquisito il blocco immediatamente, o si ottiene SQLITE_BUSY immediatamente. Quando qualcuno tiene un blocco per il database, altri tentativi di chiusura comporterà SQLITE_BUSY.

    Trattare con SQLITE_BUSY è qualcosa che devi decidere per te stesso. Per molte applicazioni, in attesa di un secondo o due e poi riprovo funziona abbastanza bene, rinunciare dopo n tentativi falliti. Ci sono sqlite3 API helper che rendono questo facile, ad esempio, sqlite3_busy_handler() e sqlite3_busy_timeout(), ma può essere fatto anche manualmente.

    Si potrebbe anche usare OS livello di sincronizzazione per acquisire un mutex lock per il database, o utilizzare OS livello inter-thread/inter-processo di messaggistica di segnalare quando un thread è fatto l’accesso al database.

    • So che bisogna usare le transazioni all’interno di un unico processo. Tuttavia, la mia situazione è che ho più processi, in contrasto con i più thread, l’accesso stesso DB contemporaneamente. Non SQLite transazioni effettivamente gestire la concorrenza!?!?
    • Sì, giù in sqlite3 specifiche del sistema operativo porting di livello c’è la funzionalità per il blocco che funziona attraverso i processi. Vedere sqlite.org/lockingv3.html per ulteriori
    • DIFFERITE, in realtà significa che il database non è (in comune) bloccato fino a quando non è accessibile da una lettura o una scrittura dopo il BEGIN istruzione (sì, è necessario bloccare la lettura). IMMEDIATA significa che il database è bloccato subito dopo l’esecuzione di “INIZIARE immediatamente la TRANSAZIONE”. Vedere sqlite.org/lang_transaction.html
    • La parola concorrenza, probabilmente, dovrebbe essere scambiati con parallelismo.
  2. 2

    Qualsiasi SQLite primitiva tornerà SQLITE_BUSY se si tenta di accedere a un database di processo accede al tempo stesso. Si potrebbe verificare che il codice di errore e ripetere l’azione.

    In alternativa si può usare OS sincronizzazione – mutex su MS Windows o qualcosa di simile su altri Sistemi operativi. Il processo di cercare di acquisire il mutex e se qualcuno già lo detiene il processo sarà bloccato fino a quando l’completato il processo di il funzionamento e rilascia il mutex. Cura dovrebbe essere presa per evitare casi in cui il processo acquisisce il mutext e poi non lo rilascia.

    • Hmm, non SQLite fornire serrature per proteggere il file di database di access??
  3. 2

    Fondamentalmente, è necessario avvolgere il vostro codice di accesso ai dati con le transazioni. Questo per evitare che i dati siano coerenti. Niente altro è necessario.

    In SQLite si utilizza

    INIZIARE LA TRANSAZIONE

    COMMIT TRANSACTION

    coppie per delimitare le vostre transazioni. Metti il tuo codice SQL in mezzo per avere eseguito in una singola transazione.

    Tuttavia, come il precedente persone che hanno commentato prima di me – è necessario prestare la massima attenzione per i problemi di concorrenza. SQLite può funzionare ragionevolmente veloce, se utilizzato per la lettura e l’accesso (di più i lettori non sono bloccati e possono essere eseguiti contemporaneamente).

    Però, il quadro cambia notevolmente se il codice intercala scrivere e leggere. Con SQLite – il vostro intero file di database viene bloccato se anche un singolo scrittore è attivo.

  4. 0

    SQLite FAQ su esattamente questo

    • Ho letto che le FAQ prima ho postato la mia domanda qui. Io, ovviamente, dovrebbe hanno detto che (questa è la lezione numero due che ho imparato oggi). Non riuscivo a vedere esattamente di cosa significasse. Devo gestire tutto il blocco roba me, o SQLite hanno il supporto per esso? “Quando qualsiasi processo la voglia di scrivere, è necessario bloccare l’intero file di database per la durata del suo aggiornamento. Ma che normalmente richiede solo pochi millisecondi. Altri processi, solo aspettare lo scrittore per finire poi continuare la loro attività.” Ci vorrebbe un po ‘ di sforzo per implementare questo per me.
    • Non solo è noioso, è soggetto ad errori di troppo. E spero SQLite avere il sostegno necessario, nel qual caso mi chiedo quali funzioni devo usare. Come nota a margine, credo che SQLite della documentazione è un po ‘ troppo sobrio quando si tratta di esempi di codice sorgente…
    • meta.stackexchange.com/questions/225370/…

Lascia un commento