Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Ошибки ORA-00604, ORA-08177 при использовании Serializable.  [new]
Андрей_7777
Member

Откуда:
Сообщений: 17
Коллеги, доброе время суток!

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

Проект:
СУБД: 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 говорит о том, что моя транзакция пытается изменить строку (или строку в том же блоке), которую изменила другая транзакция, но ошибка возникает на процедурах, которые не производят никаких изменений, а только возвращают курсоры с данными.
Еще удивляет, что не указан номер строки в пакете, на которой произошла ошибка.

Подскажите, пожалуйста, в чем м.б. причина этого?
2 фев 19, 12:09    [21800356]     Ответить | Цитировать Сообщить модератору
 Re: Ошибки ORA-00604, ORA-08177 при использовании Serializable.  [new]
-2-
Member

Откуда:
Сообщений: 14922
Андрей_7777
Ошибка ORA-08177 говорит о том, что моя транзакция пытается изменить строку
"at recursive" означает наличие неявного sql. Может быть из-за создания сегмента после старта транзакции.
Андрей_7777
не производят никаких изменений
read only
Андрей_7777
не указан номер строки в пакете, на которой произошла ошибка.
Если процедура перехватывает и пробрасывает исключение дальше, стек может не сохраняться.
2 фев 19, 13:20    [21800381]     Ответить | Цитировать Сообщить модератору
 Re: Ошибки ORA-00604, ORA-08177 при использовании Serializable.  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17682
Поведение возможно при сплите индексного блока.
Попробуйте rowdependencies
2 фев 19, 14:36    [21800400]     Ответить | Цитировать Сообщить модератору
 Re: Ошибки ORA-00604, ORA-08177 при использовании Serializable.  [new]
Андрей_7777
Member

Откуда:
Сообщений: 17
andrey_anonymous, спасибо

Установить rowdependencies нужно для всех таблиц, из которых у меня читаются данные?
Но почему все-таки при попытке вызова пакетной процедуры, только читающей данные, возникает ошибка?
2 фев 19, 16:20    [21800444]     Ответить | Цитировать Сообщить модератору
 Re: Ошибки ORA-00604, ORA-08177 при использовании Serializable.  [new]
Андрей_7777
Member

Откуда:
Сообщений: 17
-2-, спасибо

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

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

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

read only

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

Если процедура перехватывает и пробрасывает исключение дальше, стек может не сохраняться.

Все данные процедуры не перехватывают исключения
2 фев 19, 16:39    [21800466]     Ответить | Цитировать Сообщить модератору
 Re: Ошибки ORA-00604, ORA-08177 при использовании Serializable.  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29302
Андрей_7777
-2-
read only

К сожалению не получится, т.к. у меня есть пакетный метод, который в качестве промежуточный вычислений использует временную таблицу, а также есть пакетный метод, который инсертит данные в обычную таблицу.
Они вызываются после процедур, которые только читают данные, но на них тоже иногда возникает данная ошибка.
Говно-дизайн?
3 фев 19, 08:09    [21800676]     Ответить | Цитировать Сообщить модератору
 Re: Ошибки ORA-00604, ORA-08177 при использовании Serializable.  [new]
Андрей_7777
Member

Откуда:
Сообщений: 17
Elic
Андрей_7777
пропущено...

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

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

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

Хотелось бы понять, как выявить этот неявный sql, и не вызовет ли он ошибку в READ ONLY?
3 фев 19, 10:55    [21800698]     Ответить | Цитировать Сообщить модератору
 Re: Ошибки ORA-00604, ORA-08177 при использовании Serializable.  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17682
Андрей_7777
Хотелось бы понять, как выявить этот неявный sql

трасса 10046 поможет, если умеете ее правильно читать.
По факту основная масса рекурсивных SQL связана с переключением контекста (вызов SQL из PL/SQL блока и наоборот - вызов pl/sql функций из SQL).
Вылезут также триггеры, каскадные удаления по FK и т.п.
Также можно увидеть "space management" - автомагические запросы к словарю, связанные, к примеру, с выделением новых экстентов при insert.
4 фев 19, 13:38    [21801245]     Ответить | Цитировать Сообщить модератору
 Re: Ошибки ORA-00604, ORA-08177 при использовании Serializable.  [new]
xtender
Member

Откуда: Мск
Сообщений: 5243
Андрей_7777,

не проще на Using Oracle Flashback Query (SELECT AS OF) перейти?
4 фев 19, 14:17    [21801294]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить