Виталий Антипов26 января 2018 г. 4:34
"database is locked Невозможно получить строку"
Добрый день! При многопользовательском использовании sqlite3, первая программа, создавшая соединение, имеет все права, остальные могут только читать базу. Любая попытка создания, редактирования, удаления приводят к примерно такому:
error delete row Baza "database is locked Невозможно получить строку"Подскажите, как безопасно решить эту проблему?
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.Вам это нравится? Поделитесь в социальных сетях!
Комментарии
Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Пожалуйста, авторизуйтесь или зарегистрируйтесь
AD
- Akiv Doros
- 12 ноября 2024 г. 1:58
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:50баллов,
- Очки рейтинга-4
m
- molni99
- 26 октября 2024 г. 11:37
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:80баллов,
- Очки рейтинга4
m
- molni99
- 26 октября 2024 г. 11:29
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:20баллов,
- Очки рейтинга-10
Последние комментарии
ИМ
Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Игорь Максимов22 ноября 2024 г. 22:51
Evgenii Legotckoi1 ноября 2024 г. 0:37
Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
Игорь Максимов5 октября 2024 г. 17:51
QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Сейчас обсуждают на форуме
Mosquito Spray System Effective Mosquito Systems for Backyard | Eco-Friendly Misting Control Device & Repellent Spray - Moogo ; Upgrade your backyard with our mosquito-repellent device! Our misters conce…
Evgenii Legotckoi25 июня 2024 г. 1:11
t
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
tonypeachey115 ноября 2024 г. 17:04
NSProject4 июня 2022 г. 13:49
IscanderChe1 ноября 2024 г. 1:43
Добрый день. Могу только предложить закрывать соединение с базой данных, когда программме не требуется получать данные или записывать.
К сожалению, клиент-серверные бд мне не подходят - нет доступа к серверу. А постоянно открывать-закрывать соединения... даже не знаю, слишком костыльно чтоли.
Как вариант, можно попробовать работать с транзакциями, то есть открывать транзакции и закрывать их при каждой записи.
Спасибо, попробую.
Сделал вот так:
false
if there is an active query using the database for aSELECT
. Make the query inactive before doing the commit.true
if the query is active . An active QSqlQuery is one that has been exec()'d successfully but not yet finished with. When you are finished with an active query, you can make the query inactive by calling finish () or clear (), or you can delete the QSqlQuery instance.Note: Of particular interest is an active query that is a
SELECT
statement. For some databases that support transactions, an active query that is aSELECT
statement can cause a commit() or a rollback() to fail, so before committing or rolling back, you should make your activeSELECT
statement query inactive using one of the ways listed above.То есть все SELECT надо делать неактивными после использования.
В документации по setQuery() обращают внимание, что запрос должен быть активным. В итоге замкнутый круг :(
У меня такой вот вопрос, а нельзя ли как-то получив из setQuery() в модель данные, эту модель сохранить в памяти, чтобы можно было очистить setQuery, а сохраненную модель отправить в интерфейс?
Я правильно понимаю, что вы в большинстве случае используете QSqlQueryModel для интерфейса?
Теоретически можно написать свою модель данных, которая будет использовать запросы к базе данных.
Да, в подавляющем большинстве. С такой проблемой многие столкнулись, судя по форумам. QSqlQueryModel всегда держит соединение активным и никуда от этого не уйти, жаль что этого не знал раньше. Придется львиную часть логики переписывать. На уме два варианта - формировать какие-то виртуальные таблицы и использовать setQuery() к ним, либо как вы говорите делать свою модель. Модель мне нужна только для отдачи данных, изменения в базу вношу прямыми запросами. Я так понимаю, надо QVector заполнять примерно так:
Результат запроса можно выразить классом или структурой. Каждая структура будет иметь несколько полей, которые фактически будут являться колонками строк в запросе.
Вы будете иметь вектор с этими строкамиСпасибо! Только что смотрел пример AnimalModel. Вроде все понятно. А транзакции обязательно посмотрю, только в моем случае она не поможет. В документации пишут, что в некоторых случаях при транзакции SELECT db.commit() = false и необходимо закрыть запрос вручную. В моем случае использования QSqlQueryModel если сделать запросу finish(), то очистятся все данные модели, останутся только колонки и строки (первоначальная таблица стала пустой, сохранив свой размер), если clear(), то удаляется вся модель. Я тут ради интереса в обеих программах INSERT обернул в транзакции. При параллельной работе на одну базу вставка нигде не прошла. Надеюсь QVector поможет. Еще раз спасибо!
Создал тестовое приложение с QSqlQueryModel. Запустил releas и debug версии с подключением к одной базе. База заблокирована. По вашему совету все таки обернул setQuery() в транзакцию:
Вот и хорошо, что получилось всё. Успехов.
Важное дополнение для тех кто встретится с такой же проблемой. Использование fetchMore() обязательно!
я вот сейчас подумал... это ж какой трындец будет, если в базе данных будет под 100 000 записей. Подобный запрос будет давать весомую нагрузку как на приложение, так и на саму базу данных, если обновления таблицы понадобится проводить довольно часто.
Евгений, я провел тестирование на 337 000 записей. Результаты фантастические. Визуально скорость загрузки осталась та же что и для 2 000 записей - примерно 1 сек. Но есть нюанс - это при прямых запросах. А вот с вложенными сложнее.
У меня такое ощущение, что fetchMore() при прямых запросах ничего не делает, судя по скорости модель так же подгружается по мере необходимости. Но этот метод как-то разблокирует базу, то есть сообщает драйверу что запрос выполнен до конца и не активен. А по документации setQuery() используется только при активном запросе, и он походу и остается активным. Это все догадки конечно, исходники я не смотрел.
К сожалению, ничего не могу сказать за внутренности реализации модуля SQL в Qt. Тоже не доводилось им пользоваться.
Спасибо, этот тред оооочень помог. Долго ломал голову, почему на 257 записи всё падает.