On-line: PSP, гостей 1. Всего: 2 [подробнее..]
АвторСообщение



Пост N: 15
Зарегистрирован: 07.08.06
ссылка на сообщение  Отправлено: 19.09.06 16:17. Заголовок: ADS: грабли с ROLLBACK TRANSACTION, если не делать везде dbSkip(0) !!!


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


Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 21 , стр: 1 2 All [только новые]


администратор




Пост N: 386
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 27.09.06 15:52. Заголовок: Re:


Pasha Pager
см. личные сообщения на форуме

Leo
а у тебя кнопочки нет ЛС ;)
кинул мылом

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 21 , стр: 1 2 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 54
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет