0 Вопрос: Блокировка всей базы данных SQLite3 во время обновления

вопрос создан в Wed, May 8, 2019 12:00 AM

Мне нужно обновить базу данных SQLite3, которая удалит таблицу, создаст ее заново и затем снова заполнит таблицу. Я хочу убедиться, что все мои другие процессы, которые обращаются к базе данных, должны ждать завершения транзакции, чтобы избежать готовности из потенциально пустой /отсутствующей таблицы.

На данный момент мой код выглядит следующим образом:

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

Хотя это работает, я не уверен, что действительно блокирую БД. В Интернете я нашел противоречивую информацию, в которой упоминается «BEGIN TRANSACTION EXCLUSIVE» против «BEGIN TRANSACTION».

Может ли кто-нибудь объяснить, какой тип транзакции мне нужен, чтобы другие операции чтения не выполнялись, пока я заблокирован?

    
- 1
  1. Вопрос слишком широкий, потому что ответ почти полностью зависит от ваших конкретных обстоятельств. Вы подключаетесь в режиме WAL? LOCKING_MODE по умолчанию или эксклюзивный? SHARED_CACHE_MODE включен? Является ли уровень изоляции других соединений «незафиксированным» или нет? Слишком много деталей.
    2019-05-08 17: 11: 09Z
  2. Я фактически ничего не знаю о других процессах (как они написаны). Я пытаюсь обновить базу данных из командной строки bash, используя .sql, который я создал. Я хочу, чтобы другие процессы не жаловались на отсутствующую /пустую таблицу. Поэтому я хочу, чтобы мой файл .sql надлежащим образом заблокировал базу данных.
    2019-05-08 18: 08: 27Z
  3. При обычных настройках блокировка записи будет получена для удаленной таблицы и не будет снята до фиксации. Никакое другое соединение не может получить блокировку до тех пор. Но если у вас есть несколько соединений, борющихся за блокировку записи на регулярной основе, вы должны использовать другую базу данных. Много читателей и иногда писателей, может быть, Уол режим.
    2019-05-08 18: 54: 32Z
  4. @ Shawn - это обновление не частое, так что все в порядке. У меня нет контроля над установкой SQLite (поэтому я не могу изменить настройки, такие как режим WAL.) Поэтому я надеялся, что был простой ответ, такой как «BEGIN TRANSACTION XXX»
    2019-05-09 00: 12: 19Z
0 ответов                              0                         
источник размещен Вот