0 Pytanie: Blokowanie całej bazy danych SQLite3 podczas aktualizacji

pytanie utworzone w Wed, May 8, 2019 12:00 AM

Muszę zaktualizować bazę danych SQLite3, która upuści tabelę, ponownie ją utworzy, a następnie ponownie wypełni tabelę. Chcę mieć pewność, że wszystkie moje inne procesy uzyskujące dostęp do bazy danych będą musiały poczekać na zakończenie transakcji, aby uniknąć gotowości z potencjalnie pustej /brakującej tabeli.

W tym momencie mój kod wygląda następująco:

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

Chociaż to działa, nie jestem pewien, czy naprawdę blokuję DB. Znalazłem sprzeczne informacje w Internecie, które wspominają „BEGIN TRANSACTION EXCLUSIVE” vs „BEGIN TRANSACTION”.

Czy ktoś może wyjaśnić, jakiego typu transakcji potrzebuję, aby upewnić się, że żadne inne odczyty nie powiodą się, gdy mam zablokowane?

    
- 1
  1. Pytanie jest zbyt szerokie, ponieważ odpowiedź zależy prawie całkowicie od konkretnych okoliczności. Czy łączysz się w trybie WAL? Czy domyślny lub wyłączny jest LOCKING_MODE? Czy funkcja SHARED_CACHE_MODE jest włączona? Czy poziom izolacji innych połączeń jest „niezatwierdzony” czy nie? Zbyt wiele szczegółów.
    2019-05-08 17: 11: 09Z
  2. Właściwie nie wiem nic o innych procesach (jak są napisane). Próbuję zaktualizować bazę danych z wiersza poleceń bash, używając utworzonego pliku .sql. Chcę mieć pewność, że inne procesy nie narzekają na brakującą /pustą tabelę. Chcę, aby plik MY .sql odpowiednio zablokował bazę danych
    2019-05-08 18: 08: 27Z
  3. Przy normalnych ustawieniach blokada zapisu zostanie uzyskana dla tabeli upuszczania i nie zostanie zwolniona do zatwierdzenia. Żadne inne połączenie nie może uzyskać blokady do tego czasu. Ale jeśli masz wiele połączeń rywalizujących o blokady zapisu regularnie, powinieneś używać innej bazy danych. Wielu czytelników, a czasem pisarzy, może w trybie Wal.
    2019-05-08 18: 54: 32Z
  4. @ Shawn - ta aktualizacja nie jest częsta, więc jest OK. Nie mam kontroli nad instalacją SQLite (więc nie mogę modyfikować ustawień, takich jak tryb WAL). Miałem więc nadzieję, że istnieje prosta odpowiedź, na przykład „BEGIN TRANSACTION XXX”
    2019-05-09 00: 12: 19Z
0 Answers                              0                         
źródło umieszczone tutaj