NodeJS и SQLite: правильный способ проверить, заблокирована ли база данных - PullRequest
0 голосов
/ 18 апреля 2020

Мой сценарий

У меня есть (возможно, несколько экземпляров) Electron Приложение с одной маленькой sqlite3 базой данных, управляемой с помощью модуля nodejs sqlite3.
При разработке архитектуры обновлений я думал, что это будет лучше заблокировать базу данных, избегая операций чтения / записи. Для этой цели я принудительно выполняю следующую команду:

updateConnection.exec('PRAGMA locking_mode = EXCLUSIVE; BEGIN EXCLUSIVE;');

Теперь, предположив, что любой другой пользователь (игнорируя обновление приложения) выполняет любую функцию, требующую БД, мне нужно проверить, является ли БД заблокирован и, в этом случае, уведомить об этом пользователя.

Мое решение

Решение, которое я думал, состояло в том, чтобы позволить приложению обрабатывать (любой) запрос, а затем перехватывать ошибку SQLITE_BUSY.
Используя мой пользовательский класс dbmanager:

class mydbmanager {
    [...]
    // This is a representative method that could stand for mySelect(arg), myInsert(arg) etc...
    myQueryParser(arg) {
        [...]
        let result;
        let self = this;
        db.run(sql, function(error) {
            result error ? self.onError(error) : this.lastID;
        }
    }

    onError(error) {
        if (error.code == 'SQLITE_BUSY') {
            return myUtil.IsUpdateInProgress() ? "db locked BECAUSE OF the UPDATE" : "db locked. Try again... maybe";
        } else {
            return error.message;
        }
    }
}

Это правильный путь или есть лучший восходящий способ, чтобы поймать блокировку БД (возможно, перед выполнением запроса)?
Примечание: я не хочу использовать myUtil.IsUpdateInProgress() как Состояние блокировки БД вообще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...