EnglishУкраїнськаmRussian
Login/New
Topic with no new replies

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


Author Message
Written on: 15. 03. 2016 [15:38]
sonder
Олександр Клюшин
Topic creator
registered since: 24.12.2009
Posts: 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

[This article was edited 1 times, at last 15.03.2016 at 15:38.]
Written on: 15. 03. 2016 [16:32]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 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.
Written on: 15. 03. 2016 [22:14]
sonder
Олександр Клюшин
Topic creator
registered since: 24.12.2009
Posts: 47
"roman" wrote:

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

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

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

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

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

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

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

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

St.db.7z (File type: application/octet-stream, Size: 8.36 kilobytes) — 1395 downloads
Written on: 16. 03. 2016 [12:57]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"sonder" wrote:

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

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

"sonder" wrote:

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

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

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

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

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



22616