Мой сценарий
У меня есть (возможно, несколько экземпляров) 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()
как Состояние блокировки БД вообще.