Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Oracle 10g. Распределенный запрос создает транзакцию.  (Прочитано 21315 раз)
0 Пользователей и 1 Гость смотрят эту тему.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« : 02-02-2009 14:53 » 

Случайно столкнулся с такой странностью и никак не могу вычитать что-либо по этому вопросу в документации (тем более, что она обширная).

В общем, дело было так:
1. Имеется DATABASE LINK db2
2. Выполнен распределенный запрос: SELECT ... FROM local, remote@db2 WHERE ...;
3. После выборки всех полученных строк сессия остается активной (она создается при запуске приложения и сохраняется до его закрытия).

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

Проверял так:
Код: (SQL)
SELECT s.OSUSER || '@' || s.TERMINAL || '(' || s.PROGRAM || ')' ident,
        t.START_DATE, t.START_SCN
FROM V$TRANSACTION t, V$SESSION s
WHERE t.SES_ADDR = s.SADDR
ORDER BY t.START_SCNB

А наткнулся совершенно случайно: ALTER TABLESPACE ... READ ONLY долго стоит, легко останавливается и в доке сказано, что ему мешают другие транзакции.

Очень странно это ан фоне утверждения, что все это должно быть transparently...
Или я что-то не понимаю.
« Последнее редактирование: 02-02-2009 14:55 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 02-02-2009 18:21 » 

Странно, но проблема очень старая.

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:393468893370#7280037245652

В общем, transparent отменяется Жаль
Сперва нужно закрыть эту непонятную транзакцию, а потом, по обстоятельствам, и подключение к удаленной базе: ALTER SESSION CLOSE DATABASE LINK db2;
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #2 : 03-02-2009 06:32 » 

итого оттуда:
Цитата
touching a database link implicitly begins a transaction
Цитата
- "why" -- it just does, always has.  you've done something "complex" -- opened a remote session, that begins a transaction.
Цитата
as i said once above

...
"why" -- it just does, always has.  you've done something "complex" -- opened a
remote session, that begins a transaction.
......

select's can start transactions in a single instance of Oracle -- is there an issue you are having
with the fact that the transaction is "started"?  If so, we can work on solving that issue (since
changing the way it works is not really an option)
Записан

Удачного всем кодинга! -=x[PooH]x=-
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #3 : 03-02-2009 06:52 » 

RXL, Это все из-за того что ты обращаешься к удаленной БД, как ни странно, но даже простой select нужно комитить, это специфика.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 03-02-2009 16:29 » 

Тогда такой вопрос.
К примеру, для простоты подстройки запроса в программе используется VIEW. Если я изменю ее на использование линка, то по старому работать уже не будет - нужно будет коммитить?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #5 : 03-02-2009 19:28 » 

Я не большой знаток оракла, поэтому нужно проверять. Ораклист уехал на семинар, спросить не у кого.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #6 : 04-02-2009 06:13 » 

Что-то я не понял вопроса. Как используется вьюха и как ты её менять собрался?
Записан

Удачного всем кодинга! -=x[PooH]x=-
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 04-02-2009 08:02 » 

Значит так:

1. Есть вьюха, которая использует только локальные таблицы.
2. Она использована в программе в запросах типа SELECT.
3. Я изменяю ее (не в программе, конечно - ручками все) так, что она теперь использует не только локальные таблички, но и удаленные.
4. Теперь программа будет создавать незакрытые транзакции?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 04-02-2009 08:25 » 

Подкреплю примером.

БД db1 и в ней таблица ORDERS в которой есть номера клиентов. В какой-то момент в программе потребовалось выводить дополнительную информацию по клиентам из другой базы db2 из таблици SUBSTYPE. Связи db1 с db2 не было и я просто разместил копию таблицы в db1 и в запросе использую ее. Но это некошерно, т.к. данные в базах будут не синхронные. Когда связь между базами появилась, я убил в db1 таблицу SUBSTYPE и создал одноименную вьюху, которая обращается к оригинальной таблице в db2. В программе ничего не менял.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #9 : 04-02-2009 10:28 » 

Думаю, что все равно будет создаваться транзакция, так как VIEW это, вроде как, просто "хранимый запрос".
Ты над MATERIALIZED VIEW не думал? с обновлением по COMMIT или по времени? Оьновление будет идти отдельной транзакцией и у тебя будет актуальная локальная копия.
Записан

Удачного всем кодинга! -=x[PooH]x=-
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 04-02-2009 10:51 » 

Думал, но не сильно. Попробую.
Пока больше пытаюсь предвидеть, где этот эффект еще всплывет.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #11 : 04-02-2009 11:17 » 

Не проверял, но есть предположение, что при обращении к удаленной таблице оракл открывает соединение к удаленной БД и создает транзакцию, а при закрытии транзакции закрывает соединение. Ну, имхо, в общем-то логично =)
« Последнее редактирование: 04-02-2009 11:21 от PooH » Записан

Удачного всем кодинга! -=x[PooH]x=-
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 04-02-2009 14:21 » 

PooH, но если после COMMIT выполнить

ALTER SESSION CLOSE DATABASE LINK db2;

то это проходит успешно.  Данный факт сбивает с толку...
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #13 : 04-02-2009 14:34 » 

А если еще раз выполнить? Ругнется?

В любом случае, это лишь мои догадки.
Посмотри v$session на удаленной машине - там появляется коннект? И если появляется, то когда он закрывается?
Записан

Удачного всем кодинга! -=x[PooH]x=-
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 05-02-2009 07:05 » 

1. Повторное закрытие дает ORA-02081.

2. Изменения количества сессий на удаленном сервере не заметил: не при выполнении, запроса, ни при закрытии линка.

3. MATERIALIZED VIEW отлично вписалось. Для редко обновляемых таблиц-справочников вполне подходит.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #15 : 05-02-2009 07:34 » 

RXL, с MATERIALIZED VIEW, будь по аккуратнее, если у тебя будет REFRESH FAST, и ты захочешь транкейтить таблицу на которую это представление создано, а потом вставить туда данные то получишь ошибку, не помню какую.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #16 : 05-02-2009 08:12 » 

Я использую без обновления и REFRESH COMPLETE - там всего 20 строк.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #17 : 05-02-2009 09:16 » new

REFRESH COMPLETE --это гуд, он сделает все что нужно.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines