|
Ошибки ORA-00604, ORA-08177 при использовании Serializable.
|
|||
---|---|---|---|
#18+
Коллеги, доброе время суток! Прошу помочь в решении вот какой проблемы. Проект: СУБД: 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 говорит о том, что моя транзакция пытается изменить строку (или строку в том же блоке), которую изменила другая транзакция, но ошибка возникает на процедурах, которые не производят никаких изменений, а только возвращают курсоры с данными. Еще удивляет, что не указан номер строки в пакете, на которой произошла ошибка. Подскажите, пожалуйста, в чем м.б. причина этого? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2019, 12:09 |
|
Ошибки ORA-00604, ORA-08177 при использовании Serializable.
|
|||
---|---|---|---|
#18+
Андрей_7777Ошибка ORA-08177 говорит о том, что моя транзакция пытается изменить строку "at recursive" означает наличие неявного sql. Может быть из-за создания сегмента после старта транзакции. Андрей_7777не производят никаких измененийread only Андрей_7777не указан номер строки в пакете, на которой произошла ошибка.Если процедура перехватывает и пробрасывает исключение дальше, стек может не сохраняться. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2019, 13:20 |
|
Ошибки ORA-00604, ORA-08177 при использовании Serializable.
|
|||
---|---|---|---|
#18+
Поведение возможно при сплите индексного блока. Попробуйте rowdependencies ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2019, 14:36 |
|
Ошибки ORA-00604, ORA-08177 при использовании Serializable.
|
|||
---|---|---|---|
#18+
andrey_anonymous, спасибо Установить rowdependencies нужно для всех таблиц, из которых у меня читаются данные? Но почему все-таки при попытке вызова пакетной процедуры, только читающей данные, возникает ошибка? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2019, 16:20 |
|
Ошибки ORA-00604, ORA-08177 при использовании Serializable.
|
|||
---|---|---|---|
#18+
-2-, спасибо -2-Андрей_7777Ошибка ORA-08177 говорит о том, что моя транзакция пытается изменить строку "at recursive" означает наличие неявного sql. Может быть из-за создания сегмента после старта транзакции. Какой сегмент Вы имеете ввиду? Я устанавливаю уровень изолированности в serializable, далее сразу же вызываю пакетный метод, возвращающий курсоры с данными, и в этот момент иногда возникает данная ошибка. -2-Андрей_7777не производят никаких изменений read only К сожалению не получится, т.к. у меня есть пакетный метод, который в качестве промежуточный вычислений использует временную таблицу, а также есть пакетный метод, который инсертит данные в обычную таблицу. Они вызываются после процедур, которые только читают данные, но на них тоже иногда возникает данная ошибка. -2-Андрей_7777не указан номер строки в пакете, на которой произошла ошибка. Если процедура перехватывает и пробрасывает исключение дальше, стек может не сохраняться. Все данные процедуры не перехватывают исключения ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2019, 16:39 |
|
Ошибки ORA-00604, ORA-08177 при использовании Serializable.
|
|||
---|---|---|---|
#18+
Андрей_7777-2-read only К сожалению не получится, т.к. у меня есть пакетный метод, который в качестве промежуточный вычислений использует временную таблицу, а также есть пакетный метод, который инсертит данные в обычную таблицу. Они вызываются после процедур, которые только читают данные, но на них тоже иногда возникает данная ошибка.Говно-дизайн? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2019, 08:09 |
|
Ошибки ORA-00604, ORA-08177 при использовании Serializable.
|
|||
---|---|---|---|
#18+
ElicАндрей_7777пропущено... К сожалению не получится, т.к. у меня есть пакетный метод, который в качестве промежуточный вычислений использует временную таблицу, а также есть пакетный метод, который инсертит данные в обычную таблицу. Они вызываются после процедур, которые только читают данные, но на них тоже иногда возникает данная ошибка.Говно-дизайн? Изначально система была спроектирована под оффлайн-режим (данные за весь прошлый день полностью грузились ночью), соответственно тогда таких проблем не было. Сейчас требуется, чтобы эта система также работала и в онлайн-режиме (данные поступают раз в несколько минут). Пока пошел по самому простому пути - использовал SERIALIZABLE. Если не получится понять причины данной ошибки и избавиться от нее, то видимо перепишу код под READ ONLY, но у меня нет уверенности, что ошибка пропадет. Как пояснил -2-: -2-"at recursive" означает наличие неявного sql. Может быть из-за создания сегмента после старта транзакции. Хотелось бы понять, как выявить этот неявный sql, и не вызовет ли он ошибку в READ ONLY? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2019, 10:55 |
|
Ошибки ORA-00604, ORA-08177 при использовании Serializable.
|
|||
---|---|---|---|
#18+
Андрей_7777Хотелось бы понять, как выявить этот неявный sql трасса 10046 поможет, если умеете ее правильно читать. По факту основная масса рекурсивных SQL связана с переключением контекста (вызов SQL из PL/SQL блока и наоборот - вызов pl/sql функций из SQL). Вылезут также триггеры, каскадные удаления по FK и т.п. Также можно увидеть "space management" - автомагические запросы к словарю, связанные, к примеру, с выделением новых экстентов при insert. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2019, 13:38 |
|
|
start [/forum/topic.php?fid=52&fpage=85&tid=1882837]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
32ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
others: | 343ms |
total: | 476ms |
0 / 0 |