SQLite Exception: SQLite Occupé
Quelqu'un peut-il fournir des commentaires sur cette erreur. Je suis en train de les insérer dans la table à l'aide Objective C.
Alors que je fais cela, j'obtiens une erreur SQLite Occupé. Pourquoi ce qui se passe?
pouvez-vous donner un exemple de code? Quelques lignes pour comprendre ce qui se passe.
OriginalL'auteur MySQL DBA | 2009-06-08
Vous devez vous connecter pour publier un commentaire.
Si je comprends bien, "occupé" signifie que vous ne pouvez pas obtenir un verrou. Semble que, d'un autre processus (ou thread, etc) a un verrou sur une base de données.
Verrouillage De Fichier Et De La Simultanéité Dans SQLite Version 3
OriginalL'auteur
Si vous obtenez un résultat lors de l'invocation d'une sqlite3 fonction du code d'erreur SQLITE_BUSY, cela signifie, comme l'a observé drdaeman que la db a été verrouillé par le même processus ou un thread au sein de votre processus.
La bonne façon de faire face à cette situation est d'essayer de l'opération dans une boucle, et si le code de retour est encore SQLITE_BUSY, attendre un certain temps (vous décidez de la valeur de délai d'expiration), puis renouvelez l'opération dans la prochaine itération de boucle.
Par exemple, l'extrait de code suivant est tiré de l'Objectif C wrapper FMDB (http://code.google.com/p/flycode/source/browse/trunk/fmdb) montre comment préparer une déclaration pour une requête en tenant compte du fait que certaines opérations peuvent retourner SQLITE_BUSY:
Par ailleurs, si vous avez besoin d'accéder à sqlite, FMDB est très pratique et beaucoup plus simple à utiliser à l'égard de l'accès direct par le biais de la maternelle C Api.
Downvoted. Tout d'abord, si quelqu'un est en train de faire une chose, même dans un projet open-source, cela ne veut pas dire que c'est une «bonne chose». Une très bonne chose, c'est quelque chose d'indiqué dans la documentation par les auteurs de la bibliothèque en question. sqlite.org/c3ref/busy_handler.html
N: avez-vous de lire attentivement la documentation occupé gestionnaire que vous avez fourni dans votre commentaire? Il lit: "La présence d'un chargé de gestionnaire ne garantit pas qu'elle sera invoquée lorsqu'il y a conflit de verrouillage. Si SQLite détermine que l'invocation de la occupé gestionnaire pourrait entraîner un blocage, il va aller de l'avant et de retour SQLITE_BUSY ou SQLITE_IOERR_BLOCKED au lieu d'invoquer le occupé de gestionnaire." Par conséquent, il n'ya aucune garantie que SQLite appellera toujours occupé le gestionnaire que vous définissez!
oui, mais dans ce cas (en cas de blocage aboutirait à une impasse) vous ne devriez pas bloquer.
Veuillez noter la date de la réponse: 2009. Il est probable que l'API n'existait pas alors. En effet, si vous regardez que les projets récents de code (github.com/ccgus/fmdb/blob/master/src/FMDatabase.m) ils font exactement appeler cette fonction à maintenant.
OriginalL'auteur
J'ai eu un problème similaire avec SQLITE_BUSY séquentielle INSÉRER DANS les commandes. La première ligne insérée ok, mais lorsque l'application essayé d'insérer une deuxième ligne, j'ai eu l'SQLITE_BUSY état. Après que Google communique autour, j'ai appris que vous devez appeler sqlite3_finalize() sur les déclarations après l'exécution: http://www.sqlite.org/c3ref/finalize.html. La finalisation de mes déclarations fixe mon problème.
OriginalL'auteur
Dans mon cas, j'avais oublié de fermer la base de données après l'avoir utilisé. Fixe suivant la mine:
FMDB permet également d'atténuer ces maux de tête de vous facilement.
OriginalL'auteur
C'était aussi simple que l'exécution de l'invite de commande en tant qu'Administrateur pour moi. Sinon sur UNIX, vous pourriez être en mesure d'utiliser
sudo
lors du démarrage de la base de données.OriginalL'auteur