Есть ли способ заглянуть внутрь другой сессии Oracle? - PullRequest
1 голос
/ 05 мая 2009

У меня есть редактор запросов ( Toad ), просматривающий базу данных.

В то же время я также отлаживаю приложение с отдельным подключением.

Мое приложение запускает транзакцию, выполняет некоторые обновления, а затем принимает решения на основе некоторых операторов SELECT. Поскольку операторы обновления (которые являются многочисленными и сложными) еще не зафиксированы, результаты, которые мое приложение получает из своего SELECT, не совпадают с тем, что я получаю, если я запускаю тот же оператор в Toad.

В настоящее время я справляюсь с этим, выгружая вывод запроса из приложения в текстовый файл и читая его.

Есть ли лучший способ заглянуть в другой сеанс оракула и посмотреть, что видит этот сеанс, до завершения фиксации?

Другой способ задать вопрос: в Oracle можно ли разрешить «грязное» чтение только между двумя сессиями, не затрагивая чей-либо сеанс?

Ответы [ 3 ]

2 голосов
/ 06 мая 2009

Нет, Oracle не разрешает грязное чтение. Кроме того, поскольку изменения могут быть физически не записаны на диск, вы не найдете их в файлах данных. Средство записи журнала будет записывать любые ожидающие изменения данных, по крайней мере, каждые три секунды, так что вы можете использовать утилиту Log Miner, чтобы выбрать ее оттуда.

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

1 голос
/ 06 мая 2009

Это не полный ответ, я знаю, но пока нет мертвых чтений, есть блокировки, которые могут дать вам некоторое представление о том, что происходит.

В сеансе 1, если вы вставите строку с первичным ключом 7, вы не увидите ее при выборе из сеанса 2. (Это было бы грязным чтением).

Однако, если вы попытаетесь вставить из сеанса 2, используя первичный ключ 7, тогда он заблокируется за сеансом 1, так как он должен ждать и посмотреть, будет ли сеанс 1 зафиксирован или откат Вы можете использовать «ПОДОЖДИТЕ 10», чтобы подождать 10 секунд, пока это не произойдет.

Аналогичная история существует для обновлений или всего, что может привести к уникальному нарушению ограничения.

0 голосов
/ 06 мая 2009

Не можете ли вы просто установить уровень изоляции в сеансе, на который вы хотите установить пик, так, чтобы он «считал незафиксированным» временно с помощью команды alter session или триггера входа в систему (я сам не пробовал)?

Что я предпочитаю делать (в общем) - это помещать операторы отладки в коде, которые остаются там постоянно, но отключены в работе - пакет debug.f Тома Кита - полезное место для запуска - http://asktom.oracle.com/tkyte/debugf

...