Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ошибки ORA-00604, ORA-08177 при использовании Serializable. / 9 сообщений из 9, страница 1 из 1
02.02.2019, 12:09
    #39768641
Андрей_7777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибки ORA-00604, ORA-08177 при использовании Serializable.
Коллеги, доброе время суток!

Прошу помочь в решении вот какой проблемы.

Проект:
СУБД: Oracle 12.
Толстый клиент: DELPHI XE8, работа с БД осуществляется через компоненты DOA.

В БД раз в несколько минут джобом грузятся данные, которые затрагивают около 10 таблиц.
Т.е. происходит insert/update данных в несколько таблиц, потом выполняется коммит, который фиксирует изменения сразу для всех таблиц. И так раз в несколько минут.

В толстом клиенте есть форма, которая отображает информацию из этих таблиц.
Чтение информации для этой формы осуществляется вызовами нескольких пакетных процедур, которые выполняются длительное время. Проблема в том, что между вызовами процедур может выполнится коммит загрузки, описанной выше, тогда часть процедур возвратят данные до коммита, другая часть - после. Такого быть не должно, все процедуры должны возвратить согласованные данные на один момент времени.

Для решения данной проблемы перед вызовом этих процедур я устанавливаю уровень изолированности сессии в serializable, после вызова всех процедур возвращаю его обратно в read commited.

Но почему-то периодически (ошибка плавающая) при вызове пакетных процедур, которые только читают данные и возвращают курсоры с ними, возникают следующие ошибки:
ORA-00604: error occurred at recursive SQL level 1
ORA-08177: can't serialize access for this transaction. Индекс 0
Данные ошибки всегда одни и те же, но возникают при вызове разных пакетных процедур.

Ошибка ORA-08177 говорит о том, что моя транзакция пытается изменить строку (или строку в том же блоке), которую изменила другая транзакция, но ошибка возникает на процедурах, которые не производят никаких изменений, а только возвращают курсоры с данными.
Еще удивляет, что не указан номер строки в пакете, на которой произошла ошибка.

Подскажите, пожалуйста, в чем м.б. причина этого?
...
Рейтинг: 0 / 0
02.02.2019, 13:20
    #39768653
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибки ORA-00604, ORA-08177 при использовании Serializable.
Андрей_7777Ошибка ORA-08177 говорит о том, что моя транзакция пытается изменить строку "at recursive" означает наличие неявного sql. Может быть из-за создания сегмента после старта транзакции.
Андрей_7777не производят никаких измененийread only
Андрей_7777не указан номер строки в пакете, на которой произошла ошибка.Если процедура перехватывает и пробрасывает исключение дальше, стек может не сохраняться.
...
Рейтинг: 0 / 0
02.02.2019, 14:36
    #39768669
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибки ORA-00604, ORA-08177 при использовании Serializable.
Поведение возможно при сплите индексного блока.
Попробуйте rowdependencies
...
Рейтинг: 0 / 0
02.02.2019, 16:20
    #39768694
Андрей_7777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибки ORA-00604, ORA-08177 при использовании Serializable.
andrey_anonymous, спасибо

Установить rowdependencies нужно для всех таблиц, из которых у меня читаются данные?
Но почему все-таки при попытке вызова пакетной процедуры, только читающей данные, возникает ошибка?
...
Рейтинг: 0 / 0
02.02.2019, 16:39
    #39768704
Андрей_7777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибки ORA-00604, ORA-08177 при использовании Serializable.
-2-, спасибо

-2-Андрей_7777Ошибка ORA-08177 говорит о том, что моя транзакция пытается изменить строку
"at recursive" означает наличие неявного sql. Может быть из-за создания сегмента после старта транзакции.

Какой сегмент Вы имеете ввиду?
Я устанавливаю уровень изолированности в serializable, далее сразу же вызываю пакетный метод, возвращающий курсоры с данными, и в этот момент иногда возникает данная ошибка.
-2-Андрей_7777не производят никаких изменений
read only

К сожалению не получится, т.к. у меня есть пакетный метод, который в качестве промежуточный вычислений использует временную таблицу, а также есть пакетный метод, который инсертит данные в обычную таблицу.
Они вызываются после процедур, которые только читают данные, но на них тоже иногда возникает данная ошибка.
-2-Андрей_7777не указан номер строки в пакете, на которой произошла ошибка.
Если процедура перехватывает и пробрасывает исключение дальше, стек может не сохраняться.

Все данные процедуры не перехватывают исключения
...
Рейтинг: 0 / 0
03.02.2019, 08:09
    #39768822
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибки ORA-00604, ORA-08177 при использовании Serializable.
Андрей_7777-2-read only

К сожалению не получится, т.к. у меня есть пакетный метод, который в качестве промежуточный вычислений использует временную таблицу, а также есть пакетный метод, который инсертит данные в обычную таблицу.
Они вызываются после процедур, которые только читают данные, но на них тоже иногда возникает данная ошибка.Говно-дизайн?
...
Рейтинг: 0 / 0
03.02.2019, 10:55
    #39768839
Андрей_7777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибки ORA-00604, ORA-08177 при использовании Serializable.
ElicАндрей_7777пропущено...

К сожалению не получится, т.к. у меня есть пакетный метод, который в качестве промежуточный вычислений использует временную таблицу, а также есть пакетный метод, который инсертит данные в обычную таблицу.
Они вызываются после процедур, которые только читают данные, но на них тоже иногда возникает данная ошибка.Говно-дизайн?
Изначально система была спроектирована под оффлайн-режим (данные за весь прошлый день полностью грузились ночью), соответственно тогда таких проблем не было.
Сейчас требуется, чтобы эта система также работала и в онлайн-режиме (данные поступают раз в несколько минут). Пока пошел по самому простому пути - использовал SERIALIZABLE.
Если не получится понять причины данной ошибки и избавиться от нее, то видимо перепишу код под READ ONLY, но у меня нет уверенности, что ошибка пропадет.

Как пояснил -2-:
-2-"at recursive" означает наличие неявного sql. Может быть из-за создания сегмента после старта транзакции.

Хотелось бы понять, как выявить этот неявный sql, и не вызовет ли он ошибку в READ ONLY?
...
Рейтинг: 0 / 0
04.02.2019, 13:38
    #39769195
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибки ORA-00604, ORA-08177 при использовании Serializable.
Андрей_7777Хотелось бы понять, как выявить этот неявный sql
трасса 10046 поможет, если умеете ее правильно читать.
По факту основная масса рекурсивных SQL связана с переключением контекста (вызов SQL из PL/SQL блока и наоборот - вызов pl/sql функций из SQL).
Вылезут также триггеры, каскадные удаления по FK и т.п.
Также можно увидеть "space management" - автомагические запросы к словарю, связанные, к примеру, с выделением новых экстентов при insert.
...
Рейтинг: 0 / 0
04.02.2019, 14:17
    #39769224
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибки ORA-00604, ORA-08177 при использовании Serializable.
Андрей_7777,

не проще на Using Oracle Flashback Query (SELECT AS OF) перейти?
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ошибки ORA-00604, ORA-08177 при использовании Serializable. / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]