SQLite - comment puis-je gérer contention potentiel entre deux threads séparés accédant à la même base de données?
-
21-09-2019 - |
Question
QUESTION: Comment puis-je gérer discorde potentiel entre deux threads séparés l'accès à la même base de données SQLite
CONTEXTE: J'ai une application C # Winforms qui utilise SQLite via ADO.net. J'ai un fil BackgroundWorker dans l'application WinForms. Je l'ai remarqué que je peux faire une exception quand les deux le fil principal et le thread de travail de fond, tentent de mettre à jour la base de données SQLite, à savoir appeler un DBDataAdaptor.Update () ..
Je suis intéressé par ce que vérifie mon code (quoique principal code fil et / ou un code qui fonctionne dans BackgroundWorker) pour gérer cette grâce, soit par un moyen de vérifier au préalable, ou de bloquer jusqu'à ce que OK, ou soulevant une erreur spécifique Je peux attraper ...
Merci
La solution
Dans sqlite vous pouvez configurer un rappel qui est déclenchée lorsque vous rencontrez une erreur de SQLITE_BUSY
ou SQLITE_IOERR_BLOCKED
(voir http://www.sqlite.org/c3ref/busy_handler.html ).
Comme la plupart du temps ce que vous voulez faire est dormir et essayer de nouveau la requête sur occupation, sqlite a construit dans le rappel qui fait exactement cela; lire sur sqlite3_busy_timeout
http://www.sqlite.org/c3ref/busy_timeout.html.