Форум » Clipper » ADS: грабли с ROLLBACK TRANSACTION, если не делать везде dbSkip(0) !!! » Ответить

ADS: грабли с ROLLBACK TRANSACTION, если не делать везде dbSkip(0) !!!

p519446: hi all. Не знаю, выплывало ли "это" здесь или нет. Извините, если повтор. Я тут обнаружил (проведя в поисках "щасья" почти 12 часов :-)), что после КАЖДОЙ команды записи в поля таблиц, проводимой ВНУТРИ ТРАНЗАКЦИИ, надо ОБЯЗАТЕЛЬНО делать DBSKIP(0) или DBGOTO( RECNO() ), иначе при откате транзакции нас ждёт "чудо": "грязные" значения в НЕКОТОРЫХ таблицах останутся ***ВИДИМЫМИ*** после отката транзакции. И произойдёт это в тех таблицах, для которых соблюдаются следующие условия: 1) в рамках текущей транзакции была проведена запись в какие-либо поля 2) после записи в эти поля указатель НЕ сдвигался с изменённой строки и НЕ была выполнена команда сброса кеша на сервак в виде dbSkip(0) или dbGoto( recNo() ) 3) командой SELECT была выбрана какая-либо **ДРУГАЯ** АДС-таблица (неважно, делались ли изменения в этой другой таблице или нет). в тех таблицах, в которых какие-то поля изменились, но НЕ было сделано dbSkip(0), "грязные" значения в полях останутся ***ВИДИМЫМИ*** после отката транзакции. Эта "приятная фишечка" проверена на АДС 6.11 для нетвари и на АДС 8.* для Win2000 (TRIAL). Коннект в обоих случаях шёл по протоколу IPX (clipper 5.2e) Всем желающим предлагаю провести на своих АДСах следующий тест: 1. Создайте три таблицы: TEST0.DBF с полем FLD1 C 1 TEST1.DBF с полями FLD1 C 8, FLD2 N 12 2, AXS_TPS C 1 TEST2.DBF с полями FLD1 C 8, FLD2 N 12 2, AXS_TPS C 1 2. Откройте таблицу TEST2 в любом dbf-едиторе 3. Добавьте в таблицу TEST2 одну строку, НЕ заполняя поля данными. 4. Выполните приведенный ниже код: SET EXCL OFF USE TEST0 VIA "DBFCDXAX" SHARED NEW // только для вызова AX_AXSLOCKING(.F.) AX_AXSLOCKING(.F.) // чтобы видеть таблицы в других окнах с исп-ем RDD # 'DBFCDXAX' USE TEST1 VIA "DBFCDXAX" SHARED NEW USE TEST2 VIA "DBFCDXAX" SHARED NEW SELE TEST2 AX_RLOCK(RECN()) SELE TEST1 AX_RLOCK(RECN()) AX_TRANSACTION(1) // ........................... B E G I N T R A N S A C T I O N ......................... SELE TEST2 REPL FLD1 WITH TIME(),FLD2 WITH SECONDS() *** НАМЕРЕННО закомментированно: dbGoto( recNo() ) или dbSkip(0) SELE TEST1 // обязательно выбрать перед rollback'ом другую область! AX_TRANSACTION(3) // ........................... R O L L B A C K T R A N S A C T I O N ...................... QUIT 5. Освежите экран в dbf-едиторе (там был открыт файл TEST2) и полюбуйтесь результатом. ... Или у Вас всё вышло хорошо и системного времени в поле FLD1 не осталось ? ЗЫ. Линковал вот с этими файлами: dbfaxs.lib 279507 12.09.2003 05:20 axsbcomm.lib 29785 12.09.2003 07:00 dbfcdxax.obj 792 30.03.1998 05:20

Ответов - 21, стр: 1 2 All

suv2: нету тут АДС-ников кроме тебя и меня) да и я - бывший) транзакции один ты юзаешь, остальным - насрать)

p519446: Ну тада ты попробуй на досуге... :-) Уж очень хотца убедиться, что это не у меня одного такое происходит...

Pasha: Нет у меня сейчас под рукой живого Ads, чтобы посмотреть Но имхо так с ads работать нельзя Установить AX_AXSLOCKING(.F.) и после этого еще желать чтобы работали C/S средства нелепо Не будут они работать и не должны И этот режим лучше вообще НИКОГДА не использовать, тогда уж Ads не нужен, теряются все его преимущества Попробуй тест без AX_AXSLOCKING(.F.)


p519446: AX_AXSLOCKING(.F.) я поставил только потому, что у меня ASC.EXE почему-то не может открыть .dbf-ники via "DBFCDXAX" на машине, где установлен ADS for Win (это дома). На работе же я делал этот тест БЕЗ вызова этой ф-ции (там novell и ADS 6.11), и результат -- тот же.

p519446: ЗЫ. Только что проверил этот тест ***БЕЗ*** вызова AX_AXSLOCKING(.F.), на машине, где установлен ADS 8.* TRIAL (Win2000): ес-сно, всё с тем же результатом. "Грязные данные" в последней строке всех алиасов, кроме ТЕКУЩЕГО (который выбран непосредственно перед dbUnlockAll или quit'ом), ***ОСТАЮТСЯ*** видимыми после отката транзакции. Выход, конечно, есть, и очень простой: вместо ax_Transaction(3) написать функцию-обёртку, в которой перед вызовом ax_Transaction(3) делать "опрос" всех алиасов и в каждом из них, если у него RDDNAME()=='DBFCDXAX', делать dbGoto( recNo() ). Ну и не забыть всадить вызов этой обёртку в ErrorSys, чтобы при всяких аварийных clipper-вывалах откат TRN выполнянлся бы по-человечьи, а не по "штатному" АДС-порядку.

Григорьев Владимир: Я краем уха слышал, что Clippe- клиент не поддерживается в 8 версии ADS.

Dima: Григорьев Владимир пишет: Я краем уха слышал, что Clippe- клиент не поддерживается в 8 версии ADS. Вроде с 7 клиентом должно работать и потом заломанной версии или регистрилки к 8 ADS пока не придумали

p519446: Clipper RDD 7.1 выставлен к скачиванию для АДС 8.* на сайте ES. И цепляется он к нему нормально, без всяких траблов.

p519446: ЗЫ. Даже если бы для АДС 8.* клиппер-клиент уже не работал бы, всё равно вопросик/проблемка остаётся: ведь этот эффект проявляется и на АДС 6.11 (для Netware - точно). Имхо, какая-то ошибка сидит в том коде, которым АДС подменивает dbUnlock() и dbUnlockAll() -- в той ветке, которая отрабатывает при ОТКАТЕ транзакции.

Pasha: p519446 пишет: Выход, конечно, есть, и очень простой: вместо ax_Transaction(3) написать функцию-обёртку, в которой перед вызовом ax_Transaction(3) делать "опрос" всех алиасов и в каждом из них, если у него RDDNAME()=='DBFCDXAX', делать dbGoto( recNo() ). Все намного проще. См в ch - файле команды begin transaction итд Перед вызовом ax_Transaction там выдается dbCommitAll() Транзакцию нельзя завершать если клиент не все передал на сервер dbGoto( recNo() ) выдает тот же коммит

p519446: Хм... да, ты прав. Я вообще этот файл никогда не смотрел, всё делаю через функции и не подозревал, что команды begin/commit/rollback на самом деле не простые псевдовызовы этих же ф-ций, а составные инструкции. Жаль только, что в доке они не указали про эту "фишечку"...

suv2: p519446 пишет: что команды begin/commit/rollback на самом деле не простые псевдовызовы этих же ф-ций, а составные инструкции. Жаль только, что в доке они не указали про эту "фишечку"... я тебе 3 года назад говорил - загляни в std.ch - увидишь много интересного. ты сказал, шо тебе это нах не нада)

p519446: 2suv: 3 года назад у меня времени не хватало в туалет по малой нужде сбегать, не то что в стд.аш глазеть (сначала индексы валились почти каждый день, потом на сикс переходил с грохотом, потом на АДС с не меньшим гимором). ЗЫ. А причём тут стд.аш ? в этом конкретном случае надо было пялиться совсем в другое место -- в dbfcdxax.ch! :-)

suv2: ну при том, чтобы прочухать сам механизм препроцессора. там наиболее разнообразно, имхо, среди всех CH, представлены фичи препроцессора

Dima: если кому интерестно 23.09 этого года вышел Advantage Database Server v8.00.0.11 for Виндец ;) гена к этому делу есть

p519446: Чрезвычайно интересно!! Буду ОЧЕНЬ признателен и жду по адресу: p519446 <сабацька> yandex.ru ЗЫ. А для новелла такого (8.x) же нет ?

Dima: p519446 пишет: p519446 <сабацька> yandex.ru ушло p519446 пишет: А для новелла такого (8.x) же нет ? нет

Pasha: Можно и мне адрес ?

Leo: Dima Dima пишет: если кому интерестно 23.09 этого года вышел Advantage Database Server v8.00.0.11 for Виндец ;) гена к этому делу есть И мне пожалуйста на Leo@zt.aval.ua

Pager: DimaDima пишет: если кому интерестно 23.09 этого года вышел Advantage Database Server v8.00.0.11 for Виндец ;) гена к этому делу есть мне интересно! хочу полукать! скинь пожалуйста на KhromovSergey@gmail.com или ткни где можно глянуть!



полная версия страницы