Форум » 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

Dima: Pasha Pager см. личные сообщения на форуме Leo а у тебя кнопочки нет ЛС ;) кинул мылом



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