Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Вопрос по выгрузке данных из Sybase в Oracle / 11 сообщений из 11, страница 1 из 1
06.10.2005, 14:08
    #33309052
technomag5
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по выгрузке данных из Sybase в Oracle
Всем доброго времени суток!

Решил заглянуть с соседней Оракловой ветки в вашу.
Возникли вопросы. С Sybase никогда не работал.

Есть 2 системы. Оракловая и на Sybase. В Оракловую систему
часть данных подгружается через ODBC+Generic Connectivly
из Sybase. Возникли некоторые разногласия с Вашим коллегой
(администратором Sybase 12).

Сначала буквально пару слов по Oracle.
В Оракле есть понятия:
1. Direct transaction например: select * from T;
2. Indirect transaction например: select * from T1@dia5nt;
3. Distributed transaction например: select * from T1@dia5nt, T where T.ID=100;

Таким образом, в случае дистрибутивной транзакции выборка идет из
2-х систем. Многие считают индирект транзакции так же дистрибутивными,
но я пишу точно в соотв-ии с документацией Oracle!

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

insert into T (...клонки Oracle табл...)
select (Колонки Sybase табличек)
from T1@dia where T1.ID=значение; --T1 - табличка в Sybase

У Oracle есть постулат о неделимости транзакции.
Он означает, что должно соблюдаться условие целостности данных
вне зависимости от количества систем. Например, update может
использовать данные из 100 таблиц 10 удаленных БД(через db link).

Далее делаю в Oracle

DECLARE

n_dealid NUMBER;
n_brokerjpid NUMBER;
n_customerid NUMBER;

BEGIN

FOR i IN 1..5000 LOOP

select b."DEALID", b."BROKERJPID", b."CUSTOMERID"
into n_dealid, n_brokerjpid, n_customerid
from IT_BARGAINS@DIA b
where b.DEALID = 10;

dbms_output.put_line(' DEALID ' || n_dealid || ' BROKERJPID ' || n_brokerjpid || ' CUSTOMERID ' || n_customerid);

--commit;--юзер транз. каждый раз открывается заново

END LOOP;

--commit;--вроде идет одна

END;


И в DBArtisan наблюдаю $user_transaction на Sybase???
Вообще говоря с т.з. Oracle транзакция - это операция
приводящая к неким изменениям в БД, т.е. DML операция.
Операция SELECT таковой вообще говоря не является, т.к.
не вносит каких-либо изменений в данные системы. Данная
команда выделяется из обычных DML операций во всей документации Oracle.
---------------------------------------------------------
Вопрос. С т.з. Sybase. Растет ли при этом select на Sybase транзакционный лог?
Ресурс сервера(память, процессорное и шпиндельное время) понятно тратится...
Эти 5000 select в цикле - это одна транзакция на Sybase или открывается и закрывается 5000 транзакций? По идее она одна(см. commit-ы выше).
---------------------------------------------------------
Далее

DECLARE

BEGIN

FOR i IN 1..5000 LOOP

insert into IT_BARGAINS (DEALID,BROKERJPID,CUSTOMERID)
select b."DEALID",b."BROKERJPID",b."CUSTOMERID",
from IT_BARGAINS@DIA b
where b.DEALID = 10;

--commit; --1--
END LOOP;

commit; --2--

END;

С т.з. Oracle если возможно сделать что-либо одной транзакцией -
это нужно делать одной транзакцией(цитата Тома Кайта), т.е. commit; --2--
Ведь в данном случае мы получаем дистрибутивную транзакцию
и Оракловый two-point commit как следствие.
Поясню. Что бы обеспечить целостность данных
Oracle делает завершение транзакции (условно commit/rollback)
в обоих системах! У себя(что естественно) и на удаленной системе.
Причем управлять транзакцией в удаленной системе нельзя!
Не возможно послать commit or rollback в удаленную систему!
При завершении транзакции на point of commit она завершается
и на удаленной системе!

Вопрос. С т.з. Sybase commit: --2-- вероятнее всего предпочтительнее?
В действующем софте используется commit; --1--, т.о.
$user_transaction "пляшет" во время операций выгрузки данных
вызывая всплески ярости Вашего коллеги.
(Софт писал не я. Я его буду переписывать, хоть и работаю Оракловым адм.)

С т.з. Sybase как лучше? Что происходит в системе?
Транзакционные Логи растут?
Ведь при инсерте в свою Oracle базу я делаю лишь select из HS(Sybase).

Если я делаю commit; --2-- Это действительно одна транзакция у Sybase???
Насколько я понимаю, когда идет commit; --1-- на Sybase каждый раз открывается
новая $user_transaction?

С другой стороны, при работе через ODBC опять же лучше завершать
только все целиком. Уж очень она не надежна!

А если выгрузка свалится? Пойдет rollback по 2-ум системам сразу!
Кроме того, если пользователь задаст большой интервал
выборки, то это так же сильно подгрузит систему! Ведь пользователь
может и ошибиться, поставить дату не 1-2 мес, а например 1 год.
В этом случае лучше commit; --1--

Можно много дискутировать на данную тему, но хотелось бы
услышать мнение спецуры Sybase.
Как лучше это реализовать с именно т.з. Sybase?

А с Oracle у меня проблем нет, он родной, знакомый и понятный...

Заранее признателен за конструктивный ответ.
Виктор
...
Рейтинг: 0 / 0
06.10.2005, 19:38
    #33310178
Zhora
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по выгрузке данных из Sybase в Oracle
С такими делами опыта пока не имею, но в том же DBArtisane легко увидеть
динамику изменения Sybase's ASE trlog-oв прямо на картинке.
а на selecte в Sybase в трлог тоже по идее ничего не пишется.
Тут же еще присутствуют 3 ипостаси кроме Sybase и Oracle, которые
по идее могут лепить что-то своё:
1. Connectivity/Complier Sybase->Oracle
2. ODBC
3. Dbartisan (maло ли что он показывает как $user_transaction)
...
Рейтинг: 0 / 0
06.10.2005, 23:34
    #33310375
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по выгрузке данных из Sybase в Oracle
автор
Операция SELECT таковой вообще говоря не является, т.к.
не вносит каких-либо изменений в данные системы. Данная
команда выделяется из обычных DML операций во всей документации Oracle.


Чтение данных - тоже транзакция.
...
Рейтинг: 0 / 0
07.10.2005, 00:03
    #33310393
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по выгрузке данных из Sybase в Oracle
technomag5Вопрос. С т.з. Sybase. Растет ли при этом select на Sybase транзакционный лог?


Нет

technomag5
Ресурс сервера(память, процессорное и шпиндельное время) понятно тратится...
Эти 5000 select в цикле - это одна транзакция на Sybase или открывается и закрывается 5000 транзакций? По идее она одна(см. commit-ы выше).


Это смотря как ею Оракл управляет. Может быть и так, и так. Скорее всего - одна.

technomag5
Поясню. Что бы обеспечить целостность данных
Oracle делает завершение транзакции (условно commit/rollback)
в обоих системах! У себя(что естественно) и на удаленной системе.
Причем управлять транзакцией в удаленной системе нельзя!
Не возможно послать commit or rollback в удаленную систему!
При завершении транзакции на point of commit она завершается
и на удаленной системе!


Ничего не понял, почему это нельзя ? Можно, нужно и даже обязательно.

technomag5
Вопрос. С т.з. Sybase commit: --2-- вероятнее всего предпочтительнее?
В действующем софте используется commit; --1--, т.о.
$user_transaction "пляшет" во время операций выгрузки данных
вызывая всплески ярости Вашего коллеги.
(Софт писал не я. Я его буду переписывать, хоть и работаю Оракловым адм.)


Sybase - блокировщик, как и многие СУБД помимо Оракла и еще пары (точнее Оракл, на сколько я знаю, тоже блокировщик, но он более хитро разводит писателей и читателей). Во время транзакции накладываются блокировки на читаемые данные. Эти блокировки (!!!) запрещаю другим транзакциям менять эти данные, пока не закончится ваша выгрузка.
В зависимости от уровня изоляции (который наверняка ставит Оракл) блокировки могут отпускаться после прочтения "куска" данных, или после прочтения всех данных и окончания транзакции.
Видимо, вашего коллегу смущает именно это.

technomag5
Если я делаю commit; --2-- Это действительно одна транзакция у Sybase???
Насколько я понимаю, когда идет commit; --1-- на Sybase каждый раз открывается
новая $user_transaction?

Видимо, все одна транзакция. Точно сказать не могу, поскольку не понятно, что Оракл посылает Sybase-у.

technomag5
С другой стороны, при работе через ODBC опять же лучше завершать
только все целиком. Уж очень она не надежна!

Не понял ничего.

technomag5
А если выгрузка свалится? Пойдет rollback по 2-ум системам сразу!


Надо надеяться, что да.

technomag5
Кроме того, если пользователь задаст большой интервал
выборки, то это так же сильно подгрузит систему! Ведь пользователь
может и ошибиться, поставить дату не 1-2 мес, а например 1 год.
В этом случае лучше commit; --1--


Не понимаю , чего он лучше. В данном случае, все едино, поскольку ничего не
меняется в ASE-шной базе. И то и другое отпустит блокировки и все.

technomag5
Как лучше это реализовать с именно т.з. Sybase?


А что, есть выбор ? Чем это не устраивает ?
...
Рейтинг: 0 / 0
07.10.2005, 13:04
    #33311411
technomag5
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по выгрузке данных из Sybase в Oracle
MasterZivЧтение данных - тоже транзакция.
Согласен, его так принято называть. Но я же уже писал, что
в терминологии Oracle транзакция - это атомарная операция, которая должна
быть завершена явно или не явно. Операция select этого не требует. Вы не найдете в оригинальной документации Oracle в разделе "Introduction to Transactions" - (A transaction is a logical unit of work that contains one or more SQL statements. A transaction is an atomic unit. The effects of all the SQL statements in a transaction can be either all committed (applied to the database) or all rolled back (undone from the database).) никаких упоминаний о SELECT
SELECT - в документации как бы выносится в виде отдельной операции.
Т.о. в Oracle select завершается неявно(как оно там идет на уровне Ораклового ядра - не знаю! Скорее всего идет неявное завершение).

А вообще, когда например, вы вставляете карточку в банкомат и чего то там получаете или не получаете - это тоже транзакция.

будем считать select тоже транзакцией...

Вопрос был вообще то говоря по оптимизации работы на Sybase. Вы им занимаетесь - вам и карты как говорится ...

MasterZivНет Спасибо!

MasterZivЭто смотря как ею Оракл управляет. Может быть и так, и так. Скорее всего - одна. Спрасибо! В Артизане тоже "не мелькает"!

MasterZiv
Ничего не понял, почему это нельзя ? Можно, нужно и даже обязательно. А чего тут не понятного? Правда у Т.Кайта это описано лучше, но я прям из родной доки...(((Two-Phase Commit Mechanism
Unlike a transaction on a local database, a distributed transaction involves altering data on multiple databases. Consequently, distributed transaction processing is more complicated, because Oracle must coordinate the committing or rolling back of the changes in a transaction as a self-contained unit. In other words, the entire transaction commits, or the entire transactions rolls back.
Oracle ensures the integrity of data in a distributed transaction using the two-phase commit mechanism. In the prepare phase, the initiating node in the transaction asks the other participating nodes to promise to commit or roll back the transaction. During the commit phase, the initiating node asks all participating nodes to commit the transaction; if this outcome is not possible, then all nodes are asked to roll back.))) Вы не можете явно управлять транзакцией в удаленной базе! Тока завершив ее на Oracle-овой она завершается не явно на удаленной.

MasterZivSybase - блокировщик, как и многие СУБД помимо Оракла и еще пары (точнее Оракл, на сколько я знаю, тоже блокировщик, но он более хитро разводит писателей и читателей). Во время транзакции накладываются блокировки на читаемые данные. Эти блокировки (!!!) запрещаю другим транзакциям менять эти данные, пока не закончится ваша выгрузка.
В зависимости от уровня изоляции (который наверняка ставит Оракл) блокировки могут отпускаться после прочтения "куска" данных, или после прочтения всех данных и окончания транзакции.
Видимо, вашего коллегу смущает именно это.
Вот за это БОЛЬШОЕ спасибо! Не учел! Ведь, действительно если много
записей будет считываться, то что? Sybase их при чтении (select) блокирует?
У Оракила этого нету! Там же редо и андо! Надо проверить, а то блокирну ненароком! Вообще мне это не принципиально, в Sybase таблички из которых я выгружаю в АТдельной схеме. Тока я их пользую... Но вообще на будущее - буду знать!

MasterZiv
Видимо, все одна транзакция. Точно сказать не могу, поскольку не понятно, что Оракл посылает Sybase-у. А я проверю с Вашим коллегой!

MasterZivНе понял ничего. Я в том смысле, что поскольку связка ODBC менее надежна нежели Net8, то дяденька Т.Кайт Особенно выделяет, что при работе через ODBC все лучше делать одной транзакцией, а не когда много маленьких(commit 5000 раз в цикле). Ну могу скинуть Вам его книгу в и номер странички... Знающий человек(Оракловый эксперт) так рекомендует делать...

MasterZivА что, есть выбор ? Чем это не устраивает ?
Выбора действительно нету...

Спасибо за информацию.
...
Рейтинг: 0 / 0
08.10.2005, 13:20
    #33312975
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по выгрузке данных из Sybase в Oracle
technomag5 MasterZivЧтение данных - тоже транзакция.
Согласен, его так принято называть. Но я же уже писал, что
в терминологии Oracle транзакция - это атомарная операция, которая должна
быть завершена явно или не явно. Операция select этого не требует.


В терминологии Оракла транзакция - это то же самое, что транзакция в других терминологиях. ПОтому что это стандарт ANSI и его поддерживают все, Оракл в том числе.

Операция SELECT требует его точно так же, в смысле, она начинает транзакцию, и ее нужно будет завершать. Любой DML начинает транзакцию, это так по стандарту и в Оракле тоже так. Я думаю, что вы что-то перепутали или недопоняли.

technomag5
Вы не найдете в оригинальной документации Oracle в разделе "Introduction to Transactions" - (A transaction is a logical unit of work that contains one or more SQL statements. A transaction is an atomic unit. The effects of all the SQL statements in a transaction can be either all committed (applied to the database) or all rolled back (undone from the database).) никаких упоминаний о SELECT
SELECT - в документации как бы выносится в виде отдельной операции.
Т.о. в Oracle select завершается неявно(как оно там идет на уровне Ораклового ядра - не знаю! Скорее всего идет неявное завершение).


Если не написано, что SELECT начинает транзакцию, почему вы считаете , что он ее не начинает ? Там же вообще ничего не написано. Еще раз, SELECT, как любой другой DML , начинает транзакцию.
...
Рейтинг: 0 / 0
11.10.2005, 13:22
    #33317261
technomag5
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по выгрузке данных из Sybase в Oracle
Да, select - есть транзакция(Data Concurrency and Consistency в оригинальной доке), но сам по себе SELECT у Oracle некая специфическая операция - "Read-only transaction". Ведь она не вносит изменения в данные базы. У Oracle она завершается неявно.
Например select * from T; - (директ) не требует от меня каких-либо дополнительных действий на Oracle.
А вот если я сделаю select * from T@DBLINK; -(индирект) например, на Sybase,
то увижу (via DbArtisan), что на Sybase появилась $user_transaction.
Если сделаю commit;(на Oracle) то $user_transaction на Sybase исчезнет, но сессия будет "Avaite..." висеть. При этом, select * from dba_2pc_pending;--вьюшка для просмотра "pending transaction" будет пустой.
А если не сделаю commit; , то $user_transaction так и будет висеть. Ведь явного завершения в виде commit/rollback не последовало!

Поскольку в Sybase по всей видимости отсутствует механизм сериализации(упорядочивания тр-ций) придется очень аккуратно обращаться с commit/rollback-ми
...
Рейтинг: 0 / 0
11.10.2005, 18:13
    #33318223
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по выгрузке данных из Sybase в Oracle
Если я правильно понял, Oracle по select начинает транзакцию, отдает резалт-сет клиенту и сразу закрывает транзакцию?
Сайбейзы немножко по другому сделали. Блокировки на структуру таблиц участвующих в select'е висят вплоть до явного завершения транзакции клиентом. Предполагается, что клиент сделал запрос на выборку не просто так, а будет делать изменения в таблице. И будет слегка странно если клиент сделал select, и сразу же update, a update не прошел потому что другой клиент в это время поменял структуру таблицы.
...
Рейтинг: 0 / 0
11.10.2005, 23:27
    #33318583
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по выгрузке данных из Sybase в Oracle
White OwlЕсли я правильно понял, Oracle по select начинает транзакцию, отдает резалт-сет клиенту и сразу закрывает транзакцию?
Сайбейзы немножко по другому сделали.

Что-то как-то странно, я вообще считал, что это стандарт и все должны вести себя одинаково.
На самом деле тут и Оракл не может закрыть транзакцию - он не знает, что может за этим последовать, может с клиента придет UPDATE. Так что видимо там все хитрее. К сожалению, я уже вряд ли когда в этом смогу разобраться, ибо с Ораклом меня ну очень навряд ли судьба сведет.
...
Рейтинг: 0 / 0
11.10.2005, 23:34
    #33318586
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по выгрузке данных из Sybase в Oracle
White OwlПредполагается, что клиент сделал запрос на выборку не просто так, а будет делать изменения в таблице. И будет слегка странно если клиент сделал select, и сразу же update, a update не прошел потому что другой клиент в это время поменял структуру таблицы.

Я абсолютно уверен, что в Оракле делается то же самое (я уже писал в письме выше). Там только нет блокировок на чтении и транзакция, прочитавшая таблицу, может висеть часами никому не мешая. Я думаю там хитрее должно быть, что они в какой -то момент должны понять, что вот висит транзакция, она ничего не меняла (это сервер знает), и что ей "пора на покой".
Тогда ее можно неявно изничтожить. Только вот когда такой момент настанет -- не понятно. Один момент - обрыв соединения, другой - окончание транзакции или начало явной транзакции (если там вообще такое есть), но вот когда сервер сможет обрубить транзакцию по выборке данных в форму, которая висит на клиенте --- не понятно, потому как не может он ее обрубать.
Возможно, там что-то типа timeout-ов сделано, возможно еще что-то.
...
Рейтинг: 0 / 0
13.10.2005, 18:48
    #33323652
Zhora
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по выгрузке данных из Sybase в Oracle
В Oracle существует специальная операция select ... from T ... for update (что обычно делают для последовательности на клиенте: выбрать, изменить), a затем update T ... where rowid = <rowid>, так что другой клиент хотящий обновить теже записи будет ждать и ему не дадут до commita сделать то же самое (или просто update), зато не будет потери обновления.
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Вопрос по выгрузке данных из Sybase в Oracle / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]