0 Question: Verrouillage de la base de données SQLite3 entière lors de la mise à jour

question créée à Wed, May 8, 2019 12:00 AM

Je dois mettre à jour une base de données SQLite3, qui va supprimer une table, la recréer, puis repeupler la table. Je veux m'assurer que tous mes autres processus accédant à la base de données doivent attendre la fin de la transaction pour éviter d'être prêt à partir d'une table potentiellement vide /manquante.

À ce stade, mon code est comme ceci:

PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
DROP TABLE IF EXISTS mytable;
CREATE TABLE mytable(key VARCHAR(256), value VARCHAR(256), PRIMARY KEY(key));
INSERT INTO "mytable" VALUES('key','value');
COMMIT

Tant que cela fonctionne, je ne suis pas sûr de verrouiller réellement la base de données. J'ai trouvé en ligne des informations contradictoires qui mentionnent "BEGIN TRANSACTION EXCLUSIVE" vs "BEGIN TRANSACTION".

Quelqu'un peut-il expliquer le type de transaction dont j'ai besoin pour m'assurer qu'aucune autre lecture n'est réussie tant que je la verrouille?

    
- 1
  1. La question est trop large car la réponse dépend presque entièrement de votre situation particulière. Êtes-vous connecté en mode WAL? LOCKING_MODE est-il par défaut ou exclusif? SHARED_CACHE_MODE est-il activé? Le niveau d'isolement des autres connexions est-il "lu sans engagement" ou non? Trop de détails.
    2019-05-08 17: 11: 09Z
  2. En fait, je ne sais rien des autres processus (comment ils sont écrits). J'essaie de mettre à jour la base de données à partir de la ligne de commande bash, à l'aide d'un fichier .sql que j'ai créé. Je veux m'assurer que les autres processus ne se plaignent pas d'une table manquante /vide. Je souhaite donc que MON fichier .sql verrouille correctement la base de données
    2019-05-08 18: 08: 27Z
  3. Avec les paramètres normaux, un verrou en écriture sera acquis pour la table de dépôt et ne sera pas libéré avant la validation. Aucune autre connexion ne peut acquérir un verrou d'ici là. Mais si vous avez plusieurs connexions en concurrence pour des verrous en écriture sur une base régulière, vous devriez utiliser une base de données différente. Beaucoup de lecteurs et parfois d’écrivains, peut-être en mode Wal.
    2019-05-08 18: 54: 32Z
  4. @ Shawn - cette mise à jour n'est pas fréquente, donc c'est bien. Je n'ai pas de contrôle sur l'installation de SQLite (je ne peux donc pas modifier les paramètres tels que le mode WAL.) J'espérais donc qu'il existait une réponse simple, par exemple, utilisez "BEGIN TRANSACTION XXX"
    2019-05-09 00: 12: 19Z
0 réponses                              0                         
source placée ici