Українська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 кілобайтів) — 1362 завантажень
Повідомлення створено: 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.



7227