:: Visual Foxpro, Foxpro for DOS
MAKETRANSACTABLE() вместе с BEGIN TRANSACTION роняют VFP9
Константин Мельников
Автор
Вот простой пример, сделанный изначально для проверки возможности использования в транзакциях свободных таблиц и курсоров, открытых одновременно в разных сессиях и областях:

===
SET EXCLUSIVE OFF
SET SAFETY OFF

CLEAR ALL
CLOSE DATABASES ALL

CREATE TABLE t1 (f1 C(10))
USE IN t1
USE t1 IN 0
MAKETRANSACTABLE("t1")

USE t1 IN 0 ALIAS t2 AGAIN

obj=CREATEOBJECT("Session")

SET DATASESSION TO obj.DATASESSIONID

USE t1 IN 0
USE t1 IN 0 ALIAS t2 AGAIN

BEGIN TRANSACTION
===

как только фокс выполняет BEGIN TRANSACTION, то благополучно (или не благополучно, тут как посмотреть) умирает

Интересно ловил ли кто-нибудь такое уже?

--
Константин Мельников
Ratings: 0 negative/0 positive
Re: MAKETRANSACTABLE() вместе с BEGIN TRANSACTION роняют VFP9
PaulWist

Сообщений: 14625
Дата регистрации: 01.04.2004
MAKETRANSACTABLE - а это , что за ф-ия в хелпе не нашел

Приведенный код действительно свалил фокс на раз




------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: MAKETRANSACTABLE() вместе с BEGIN TRANSACTION роняют VFP9
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi, Константин!

Нда, печально
Видать чего-то не докрутили таки... Явный претендент на багрепорт.
Кстати, у кого ещё VFP9 beta стоит - попробуйте там.




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: MAKETRANSACTABLE() вместе с BEGIN TRANSACTION роняют VFP9
piva

Сообщений: 18655
Откуда: Курган
Дата регистрации: 24.03.2004
Если в конце приведенного кода дописать
BEGIN TRANSACTION && <- это окончание приведенного кода
Wait Window "IN TRANSACTION"
*Set Datasession To 1 && <- Если раскоментировать - происходит слет
Wait Window "Switch DataSession"
Select t1
? Alias(),Dbf()
Select t2
? Alias(),Dbf()
End Transaction
У меня в хелпе 9-ки беты нету ничего про MAKETRANSACTABLE() - поэтому не могу судить чего там написано, как стало понятно (хотя и прискорбно) слет происходит при переключении сессии на дефолтную. Дальнейшие исследования показали что Begin Transaction работает только для текущей датасессии. Опять меняем приведенный код
SET EXCLUSIVE OFF
SET SAFETY OFF
CLEAR ALL
CLOSE DATABASES ALL
CREATE TABLE t1 (f1 C(10))
Insert into t1 values (Sys(2015))
USE IN t1
USE t1 IN 0
MAKETRANSACTABLE("t1")
USE t1 IN 0 ALIAS t2 AGAIN
obj=CREATEOBJECT("Session")
SET DATASESSION TO obj.DATASESSIONID
USE t1 IN 0
USE t1 IN 0 ALIAS t2 AGAIN
Set Datasession To 1
** Транзакция начинается для дефолтной датасессии
BEGIN TRANSACTION
SET DATASESSION TO obj.DATASESSIONID
** Это уже ВНЕ транзакции
Select t1
Replace t1.f1 with '****'
Set Datasession To 1
RollBack
? t1.f1 && <- возвращает "****" Транзакции как не бывало
Даже если делать OBJ публичной (PUBLIC) переменной слет все равно в наличии - интересно что это происходит если транзакция начиналась для приватной сессии. Так что я пока качать vfp9 пока не буду - это не глюк - это хуже




------------------
Часто бывает так, что есть над чем задуматься, а нечем.
Ratings: 0 negative/0 positive
Re: MAKETRANSACTABLE() вместе с BEGIN TRANSACTION роняют VFP9
AlexK

Сообщений: 2114
Откуда: Королев,Москва
Дата регистрации: 11.12.2000
*



Отредактировано (04.02.05 08:35)


------------------
Береги природу, мать Вашу. Моя страничка www.genrep.net
Ratings: 0 negative/0 positive
Re: MAKETRANSACTABLE() вместе с BEGIN TRANSACTION роняют VFP9
Владимир Максимов

Сообщений: 14100
Откуда: Москва
Дата регистрации: 02.09.2000
Для VFP9beta был отдельный файл VFP9RELNOTES.EXE (около 3М) - это список и описание дополнительных функций не включенных в основной HELP.

Описание транзакций для свободных таблиц шло в файле Data.htm.

Сам код я пока не проверял, но у меня вопрос: транзакция в VFP может в принципе существовать вне контейнера базы данных? Не будет ли достаточным создать хоят бы пустую DBC и "привязать" BEGIN TRANSACTION к это пустой базе данных?




------------------
Ratings: 0 negative/0 positive
Re: MAKETRANSACTABLE() вместе с BEGIN TRANSACTION роняют VFP9
piva

Сообщений: 18655
Откуда: Курган
Дата регистрации: 24.03.2004
Чего-то они в документации и в реализации недокрутили
Итак из Хелпа VFP9Relnotes - BETA
Цитата:
MAKETRANSACTABLE() Function
Makes a free table/cursor transactable – has ability to support transactions via BEGIN TRANSACTION.

Remarks

To make a free table or cursor transactable, use the MAKETRANSACTABLE() function. When a table is made transactable, it now supports ability to be used with BEGIN TRANSACTION, END TRANSACTION, ROLLBACK. Note: once a table is made transactable, it is transactable across all work areas and all data sessions until it's file is closed.
It is important to know that MAKETRANS() applies to ALL open instances of a table including those in other data sessions. The nWorkArea and cAlias parameters are merely used to provide a reference to the original file.
Продолжаем глумится над кодом
SET EXCLUSIVE OFF
SET SAFETY OFF
CLEAR ALL
CLOSE DATABASES ALL
CREATE TABLE t1 (f1 C(10))
Insert into t1 values (Sys(2015))
USE IN t1
USE t1 IN 0
MAKETRANSACTABLE("t1")
USE t1 IN 0 ALIAS t2 AGAIN
obj=CREATEOBJECT("Session")
SET DATASESSION TO obj.DATASESSIONID
USE t1 IN 0
USE t1 IN 0 ALIAS t2 AGAIN
Select T1
Set Datasession To 1
BEGIN TRANSACTION
SET DATASESSION TO obj.DATASESSIONID
*Set Datasession To 1 && <- Ключевой момент
? IsTransactable("t1")
Replace t1.f1 with '*****'
Set Datasession To 1
? IsTransactable("t1")
RollBack
? t1.f1

Если ключевой момент разремарить - по в начале транзакции были в дефолтной датасесии - то только в ней транзакция и была, если оставить заремареной - RollBack ничего не откатывает
Так что ничего из выделенного из Хелпа не работает. Вот такая трава. Если конечно в релизе не поификсили




------------------
Часто бывает так, что есть над чем задуматься, а нечем.
Ratings: 0 negative/0 positive
Re: MAKETRANSACTABLE() вместе с BEGIN TRANSACTION роняют VFP9
Aleksey Tsingauz [MSFT]
Здравствуйте, Константин!

Вы натолкнулись на баг, который присутствовал еще в бета версии. Жаль, что он не был найден раньше.
Если MAKETRANSACTABLE вызвана для таблицы в одной сессии, то операции с этой таблицей внутри транзакции в любой другой сессии могут вызвать C5 и ROLLBACK в этих сессиях на таблице не отразится. MAKETRANSACTABLE нормально работает только в рамках одной сессии.

Aleksey Tsingauz
Visual FoxPro Dev Team
Ratings: 0 negative/0 positive
Re: MAKETRANSACTABLE() вместе с BEGIN TRANSACTION роняют VFP9
Crip_as_guest
Вот кстати еще одно сообщение об баге, правда менее существенном.
Цитата:
Баг не совсем с поиском, скорее с преобразованием данных...
Короче, перевел приложение на VFP9 и пользователи стали жаловаться на то, что поиск "не всегда (!) ищет". Выяснилось вот что:
CREATE CURSOR test (amnt y)
INDEX ON amnt TAG amnt
SET ORDER TO

INSERT INTO test VALUES(1000)
INSERT INTO test VALUES(12345.67)
INSERT INTO test VALUES(5563.19)

LOCATE FOR amnt = 1000
?IIF(FOUND(),"Найдено","НЕ НАЙДЕНО") && Найдено
LOCATE FOR amnt = 12345.67
?IIF(FOUND(),"Найдено","НЕ НАЙДЕНО") && Найдено
LOCATE FOR amnt = 5563.19
?IIF(FOUND(),"Найдено","НЕ НАЙДЕНО") && НЕ НАЙДЕНО (!)
LOCATE FOR amnt = $5563.19 && А так работает!
?IIF(FOUND(),"Найдено","НЕ НАЙДЕНО") && Найдено


Под 8-кой все работает (скорее всего и под 7-кой, и под 6-кой - этой форме поиска много лет).
Ratings: 0 negative/0 positive
Re: MAKETRANSACTABLE() вместе с BEGIN TRANSACTION роняют VFP9
Dmitry66
Нашел еще вот что (Bug?):

Создаю таблицу:
Sum_1 n(13,2)

заполняю ее примерно 120000 строк
Пишу sum sum_1
Выдает примерно 4155412,45994860
Пишу set deci to 2
Выдает примерно 4155412,46 (как и должно быть)

Таблица расположена на сетевом диске Novell Netware 5.0
Вот такая проблема на пустом месте (Vfp8sp1 все Ок).

Дмитрий
Ratings: 0 negative/0 positive
Re: MAKETRANSACTABLE() вместе с BEGIN TRANSACTION роняют VFP9
Константин Мельников
Автор
Aleksey Tsingauz [MSFT] писал(а):
Цитата:
Вы натолкнулись на баг, который присутствовал еще в бета версии. Жаль, что он не был найден раньше.
Если MAKETRANSACTABLE вызвана для таблицы в одной сессии, то операции с этой таблицей внутри транзакции в любой другой сессии могут вызвать C5 и ROLLBACK в этих сессиях на таблице не отразится. MAKETRANSACTABLE нормально работает только в рамках одной сессии.

А есть ли вероятность, что будет выпущен SP? Уж очень интересная функция MAKETRANSACTABLE()
Ratings: 0 negative/0 positive
Re: MAKETRANSACTABLE() вместе с BEGIN TRANSACTION роняют VFP9
Aleksey Tsingauz [MSFT]
Цитата:
А есть ли вероятность, что будет выпущен SP? Уж очень интересная функция MAKETRANSACTABLE()

Вероятность есть, но никаких конкретных планов пока нет.

Ratings: 0 negative/0 positive
Re: MAKETRANSACTABLE() вместе с BEGIN TRANSACTION роняют VFP9
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi, piva!

Кстати говоря, BEGIN TRANSACTION и должна работать только для текущей
сессии! Т.е. транзакция осуществляется именно внутри некоторой сессии, и до
копий таблицы в других сессиях ей дела нет
А что баг не выловили вовремя - это жаль

P.S. Я лично Free таблицы уже давно не использую в работе (в том смысле что
проекты используют либо таблицы в dbc либо SQL-серверные), лишь для всяких
"обменов"/загрузок/выгрузок, ну и т.п. - т.е. там мне транзакции совсем ни к
чему были...




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: MAKETRANSACTABLE() вместе с BEGIN TRANSACTION роняют VFP9
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi, piva!

Кстати говоря, BEGIN TRANSACTION и должна работать только для текущей
сессии! Т.е. транзакция осуществляется именно внутри некоторой сессии, и до
копий таблицы в других сессиях ей дела нет
А что баг не выловили вовремя - это жаль

P.S. Я лично Free таблицы уже давно не использую в работе (в том смысле что
проекты используют либо таблицы в dbc либо SQL-серверные), лишь для всяких
"обменов"/загрузок/выгрузок, ну и т.п. - т.е. там мне транзакции совсем ни к
чему были...




------------------
WBR, Igor
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 26 (Гостей: 26)

© 2000-2024 Fox Club 
Яндекс.Метрика