Выберите * из таблицы @ dblink в PL / SQL Developer - PullRequest
1 голос
/ 04 ноября 2019

Когда я запускаю запрос select * from table@dblink в PL / SQL Developer, фиксация транзакции / откат значки активируются, но затем, если я использую Fetch last page, эти значки отключаются. Почему это происходит?

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

Запрос через ссылку db_ переворачивает переключатель «у нас есть транзакция» в словаре данных.

В большинстве инструментов вы будете получать подсказку для COMMIT или индикатор открытой транзакции всякий раз, когда вы запрашиваете уDB_LINK.

Это потому, что вы делаете «что-то», что нам не понятно в другой базе данных. У вашего «SELECT» могут быть побочные эффекты, требующие COMMIT / ROLLBACK, или как Том сказал бы

'Если вы распределены, вы захотите завершить все, что было неявнозапущен на удаленном сайте. '

0 голосов
/ 07 ноября 2019

Я думаю, что PL / SQL пытается удалить бесполезные транзакции, чтобы избежать ошибок сеанса. Кажется, что всякий раз, когда вы нажимаете кнопку «Получить последнюю страницу», PL / SQL Developer запускает commit write batch, если в операторе содержится ссылка на базу данных, если в сеансе в настоящий момент нет открытых транзакций и если в операторе нет FOR UPDATE.

Это много странных условий, но, похоже, они гарантируют, что программа не выполнит фиксацию, когда не должна. Я предполагаю, что PL / SQL Developer использует commit write batch, чтобы использовать меньше ресурсов, чем обычный commit. Это предположение основано на увеличении числа, возвращаемого этим запросом, когда я нажимаю кнопку. (Есть другая статистика для user commits, и это число не увеличивается.)

select value
from v$mystat
join v$statname on v$mystat.statistic# = v$statname.statistic#
where lower(display_name) = 'commit batch performed';

Это поведение немного странно, но оно может помочь предотвратить некоторые ошибки в сеансе. Например, если вы позже попытаетесь запустить alter session enable parallel dml, сеанс выдаст ошибку ORA-12841: Cannot alter the session parallel DML state within a transaction. Совершая (бесполезную) транзакцию, вы избегаете некоторых из этих ошибок.

...