Гость
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA: autocommit при вызове прокси процедуры / 8 сообщений из 8, страница 1 из 1
26.10.2011, 22:26
    #37499777
iiv77
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA: autocommit при вызове прокси процедуры
Ситуация следующая: сервер SQL Anywhere x64 12.0.1.3457, установленный на Windows 2008 x64.

При вызове из ASA прокси процедуры, смотрящей на Oracle, происходит неявный commit на стороне Oracle.
Аналогичная ситуация при вызове прокси процедуры, которая смотрит на ASE 15.5: неявный commit на строне ASE.

Если кто сталкивался, подскажите, пожалуйста: можно ли как-нибудь на SQL Anywhere отключить AUTOCOMMIT при вызове прокси процедур?
Возможно, данное поведение регулируется настройкой сервера...
Или это особенность работы сервера ASA с Remote Серверами?

На стороне ASA создана прокси процедура:
Код: plaintext
1.
create procedure t_proxy_to_oracle( @param varchar( 32 ) ) at 'oracle_odbc;;dbname;t_remote_proc';

На стороне Oracle создана таблица и процедура, которая в эту таблицу пишет:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
create table t_remote_call_param ( param_value varchar( 32 ) );

create or replace procedure t_remote_proc ( param varchar2 )
is
begin
    insert into t_remote_call_param ( param_value ) values ( param );
end;

Вызов на стороне ASA осуществляется следующим образом:
Код: plaintext
1.
2.
3.
begin tran;
call t_proxy_to_oracle( 'qwerty123' );
rollback;

После вызова видим новую строку в таблице t_remote_proc:
Код: plaintext
1.
2.
3.
4.
5.
select * from t_remote_call_param;

PARAM_VALUE
-----------
qwerty123
...
Рейтинг: 0 / 0
27.10.2011, 01:35
    #37499937
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA: autocommit при вызове прокси процедуры
iiv77
Код: plaintext
1.
create procedure t_proxy_to_oracle( @param varchar( 32 ) ) at 'oracle_odbc;;dbname;t_remote_proc';

Смотри на строку коннекта к удаленой базе. Как oracle_odbc объявлен? Где-то там оно и включено.
...
Рейтинг: 0 / 0
27.10.2011, 12:27
    #37500480
iiv77
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA: autocommit при вызове прокси процедуры
На ASA Remote Server oracle_odbc объявлен так:
Код: plaintext
1.
create server "oracle_odbc" class 'ORAODBC' using 'oracle_odbc_x64';
Пробовал настраивать ODBC oracle_odbc_x64 на следующие драйвера:
iAnywhere Solutions 12 - Oracle - этот драйвер поставился вместе с ASA;
Oracle in OraClient11g_home1 - это родной драйвер Oracle.
Результат одинаковый.

При этом, если создать на ASA прокси таблицу на t_remote_call_param и изменять данные напрямую, то все проходит ожидаемо:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
create existing table t_proxy_call_param at 'oracle_odbc;;dbname;t_remote_call_param';

select * from t_proxy_call_param;  -- выбирается одна строка
begin tran;
delete from t_proxy_call_param;
select * from t_proxy_call_param; -- таблица пустая (запрос не выводит не одной строки)
rollback;
select * from t_proxy_call_param; -- после отката выбирается одна строка

Проверил на ASA x64 9.0.2.3951, ASA x64 10.0.1.4239, ASA x64 11.0.1.2680 и ASA x64 12.0.1.3457.
Это все доступные мне версии ASA x64 с последними EBF'ами.
На всех версиях серверов после вызова прокси процедуры вызывается комит на стороне удаленного сервера.
...
Рейтинг: 0 / 0
27.10.2011, 15:54
    #37500944
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA: autocommit при вызове прокси процедуры
ASA выполняет коммит только, если опция chained установленна 'Off'. В ODBC по умолчанию включен AUTOCOMMIT. Вот что в материалах Оракла:
Autocommit is enabled by default as defined by the Microsoft ODBC
specification. With Autocommit, a transaction is committed as soon as it is executed.
While this increases user concurrency in some databases, it does not allow the programmer
to control when a transaction is committed nor does it allow a transaction to be rolled
back. To disable Autocommit, call SQLSetConnectOption with the SQL_AUTOCOMMIT_OFF
qualifier.
Взято отсюда: http://apex.oracle.com/pls/otn/f?p=100:11:0::NO::P11_QUESTION_ID:314816776423

Выхода вижу 3:
Попробовать отключить автокоммит в ODBC

Не пользоваться процедурами

Написать процедуры на АСА, используя в них remote таблицы
...
Рейтинг: 0 / 0
28.10.2011, 18:48
    #37503313
iiv77
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA: autocommit при вызове прокси процедуры
авторПопробовать отключить автокоммит в ODBC

Не пользоваться процедурами

Написать процедуры на АСА, используя в них remote таблицы


К сожалению, эти варианты не реализуемы:
Пробовал использовать ODBC драйвер от DataDirect, у которого есть опция "Отключить Autocommit" - не помогло.
Думаю, что дело не в ODBC: если подключиться SQL консолью непосредственно к ODBC источнику oracle_odbc_x64
(указан в качестве источника данных при создании Remote Server'а на ASA), то неявный commit не происходит.
На стороне Oracle многомиллионные таблицы и сложная логика обработки: переписать на ASA не представляется возможным.

Предлагаю зайти с другой стороны: у кого-нибудь есть возможность проверить на схожей конфигурации?

Если ошибка только на моей конфигурации - буду как-то искать что именно приводит к commit'у.
А если такая работа с прокси таблицами - штатная для сервера SQL Anywhere (например, описанная в документации), то решение будет совсем другое.
...
Рейтинг: 0 / 0
28.10.2011, 19:49
    #37503394
Ggg_old
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA: autocommit при вызове прокси процедуры
попробуйте еще задать вопрос на http://sqlanywhere-forum.sybase.com/
...
Рейтинг: 0 / 0
28.10.2011, 20:07
    #37503406
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA: autocommit при вызове прокси процедуры
iiv77А если такая работа с прокси таблицами - штатная для сервера SQL Anywhere (например, описанная в документации), то решение будет совсем другое.Нет, в документации написано обратное:
http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.sqlanywhere.12.0.0/dbusage/rpc-omni-using.html Using remote procedure calls (RPCs)

SQL Anywhere users can issue procedure calls to remote servers that support the feature.

This functionality is supported by SQL Anywhere, Adaptive Server Enterprise, Oracle, and IBM DB2. Issuing a remote procedure call is similar to using a local procedure call.

SQL Anywhere supports fetching result sets from remote procedures, including fetching multiple result sets. As well, remote functions can be used to fetch return values from remote procedures and functions. Remote procedures can be used in the FROM clause of a SELECT statement.

А кстати, ты уверен что внутри самой процедуры (которая на Оракле) нету commit? По хорошему, его быть не должно, но ты уверен что его действительно нет?
Сделай на Oracle тестовую микропроцедурку на тестовой микро-табличке. Убедись что она нормально откатывает если запускается из самого Оракла. Потом сделай прокси-процедуру на нее в SA и попробуй позапускать уже из SA. Будет делать autocommit или она нормально отработает rollback? Если увидишь autocommit - значит явный баг о котором надо сообщать разработчикам.
...
Рейтинг: 0 / 0
28.10.2011, 20:55
    #37503443
iiv77
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA: autocommit при вызове прокси процедуры
Ggg_old...
Спасибо за ссылку. Попробую спросить там...
White Owl...А кстати, ты уверен что внутри самой процедуры (которая на Оракле) нету commit...
Да, уверен. Текст тестовых процедуры и таблицы, на которых проверял, приведены в моем первом сообщении: (см. t_remote_proc ( param varchar2 ))
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA: autocommit при вызове прокси процедуры / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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