УкраїнськаEnglishmRussian
Вход/Новый
В теме нет новых постов

[BugFixed] Ошибка при одновременной записи и запросе SQLite


Автор Сообщение
Сообщение создано: 15. 03. 2016 [15:38]
sonder
Олександр Клюшин
Создатель темы
Зарегистрирован(а) с: 24.12.2009
Сообщения: 47
Xubuntu 14.04.4 LTS
OpenSCADA 0.9 r2336
Не уверен что это баг именно OpenSCADA, потому что не получается воссоздать его на АГЛКС, где чуть по-другому все устроено, но все таки изложу суть проблемы.
Есть архив величин периодом 1 сек. Сохраняется раз в минуту в отдельный (от основной конфигурации) файл БД SQLite.
Есть страничка с архивными диаграммами.
Если открыть страничку с диаграммами как раз в тот момент, когда архиватор записывает архивы в БД (на сервере шумный HDD - слышно отчетливо), то связь с сервером визуализации (если с удаленной станции смотреть) прерывается, и в лог всегда записывается такая ошибка (часто несколько):
/sub_BD/mod_SQLite/db_Archives/ 4 Ошибка запроса "BEGIN;": cannot start a transaction within a transaction

[Сообщение редактировалось 1 раз(а), в последний раз 15.03.2016 в 15:38.]
Сообщение создано: 15. 03. 2016 [16:32]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
"sonder" wrote:

Есть архив величин периодом 1 сек. Сохраняется раз в минуту в отдельный (от основной конфигурации) файл БД SQLite.
Есть страничка с архивными диаграммами.
Если открыть страничку с диаграммами как раз в тот момент, когда архиватор записывает архивы в БД (на сервере шумный HDD - слышно отчетливо), то связь с сервером визуализации (если с удаленной станции смотреть) прерывается, и в лог всегда записывается такая ошибка (часто несколько):
/sub_BD/mod_SQLite/db_Archives/ 4 Ошибка запроса "BEGIN;": cannot start a transaction within a transaction

Не ошибка OpenSCADA если Вы к данным БД, используемой архиватором, где-то обращаетесь через сервис sqlReq() и некорректно управляете транзакциями.

В любом случае для меня это не ошибка пока не будет воспроизводиться у меня!

Learn, learn and learn better than work, work and work.
Сообщение создано: 15. 03. 2016 [22:14]
sonder
Олександр Клюшин
Создатель темы
Зарегистрирован(а) с: 24.12.2009
Сообщения: 47
"roman" wrote:

где-то обращаетесь через сервис sqlReq() и некорректно управляете транзакциями

Нет, этот сервис нигде не используется в пользовательских скриптах. Возможно конфликт происходит тогда, когда архиватор пишет в бд и одновремено запрашивает данные из нее для диаграммы.
"roman" wrote:

В любом случае для меня это не ошибка пока не будет воспроизводиться у меня!

Просто на других системах, где я могу экспериментировать и создать проект для воспроизведения такой ситуации, не получается чётко отловить момент сброса архива в бд.
Может есть какой то флаг состояния архиватора, который выставляется при записи архива в БД и который можно обработать в javalike.calc?
Сообщение создано: 15. 03. 2016 [22:38]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
"sonder" wrote:

Просто на других системах, где я могу экспериментировать и создать проект для воспроизведения такой ситуации, не получается чётко отловить момент сброса архива в бд.
Может есть какой то флаг состояния архиватора, который выставляется при записи архива в БД и который можно обработать в javalike.calc?

Зачем? Он сбрасывает на границе периодичности архивирования, обычно это минута.
И да, я на ДемоБД(AGLKS) включал архивацию на SQLite, что делал и в рамках проверок. Получил:
- время архивации: до 200мс;
- параллельное чтение с этой базы 600 секунд никаких проблем не показало.

P.S. Там захватом ресурсов всё закрыто и вложенный вызов открытия транзакции исключён, кроме естественно прямых через sqlReq() или из других, неродных, модулей, ну или додумались подключить один файл БД дважды!

Learn, learn and learn better than work, work and work.
Сообщение создано: 16. 03. 2016 [10:56]
sonder
Олександр Клюшин
Создатель темы
Зарегистрирован(а) с: 24.12.2009
Сообщения: 47
Вкладываю бд тестового проекта.
В проекте архиватор настроен на архивацию раз в 30 сек.
Время архивации у меня - около полусекунды.
Последовательность действий для воспроизведения ошибки:
Приготовиться запустить на исполнение проект визуализации "test1".
Как только наступает время архивации (часы либо 30 секунд показывают либо истекает минута) быстро запустить проект визуализации. Проект содержит диаграммы в которых указан архиватор.
У меня иногда проходит без ошибок даже при попадании точно на время кратное 30 секунд. Но в большинстве случаев - вышеописанные ошибки.
Вложенный файл

St.db.7z (Тип файла: application/octet-stream, Размер: 8.36 килобайт) — 1395 загрузок
Сообщение создано: 16. 03. 2016 [12:57]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
"sonder" wrote:

Последовательность действий для воспроизведения ошибки:
Приготовиться запустить на исполнение проект визуализации "test1".

Достаточно было просто обновлять вкладку "Значения" у архива и для выбранного этого архиватора.

"sonder" wrote:

У меня иногда проходит без ошибок даже при попадании точно на время кратное 30 секунд. Но в большинстве случаев - вышеописанные ошибки.

Да, вижу, исправил!

Последовательность фактической отправки "BEGIN; " и "COMMIT;" нарушалась из-за одновременного планирования нескольких задач и нераспространения ресурса на эту операцию. Расширил ресурс, хотя рекурсия не желательна.

Тоже было и с MySQL, PostgreSQL.

Learn, learn and learn better than work, work and work.



1629