2012-06-05 14 views
6

Mam bazę danych sqlite na moim lokalnym hoście (Win NT) i chcę ją utworzyć. Chcę użyć polecenia powłoki ".backup", aby wykonać to zadanie. Ale wydaje się, że mogę wstawić nowe wiersze do bazy danych podczas procesu tworzenia kopii zapasowej.Polecenie powłoki sqlite3 ".backup" i transakcja

Czy polecenie powłoki ".backup" uruchamia nową transakcję wyłączności w mojej bazie danych?

Po uruchomieniu polecenia powłoki ".backup" pomyślałem, że blokuje moją bazę danych.

Odpowiedz

3

Metoda kopii zapasowej sqlite3 nie blokuje bazy danych. Proponuję użyć następującego obejścia jeśli chcesz zablokować bazy danych:

  • rozpocząć transakcję (wspólna Lock)
  • Przy użyciu dowolnego INSERT oświadczenie, baza danych staje zastrzeżonego blokadę. Jednak ta instrukcja INSERT może być pusta.
  • Wykonaj kopię zapasową bazy danych.
  • Zakończ transakcję, używając ROLLBACK lub COMMIT.

Kod:

BEGIN; 
INSERT INTO <anytable> SELECT * FROM <anytable> WHERE 1=0; 
.backup <database> <file> 
ROLLBACK; 

Mniej hacky sposób byłoby jeśli używasz tabelę o nazwie „kopia zapasowa” i wstawiasz wiersz (data, ..) dla każdej kopii (jeśli ta informacja jest dla ciebie istotna).

Powiązane problemy