powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Транзакции в private data session
19 сообщений из 19, страница 1 из 1
Транзакции в private data session
    #32175420
vklepko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

VFP 6.0 SP5.

Как правило формы, которые используются в проекте, работают в private data session и открывают необходимые для работы view в собственном data environment. Модификация данных производится с помощью
begin transaction, tableupdate, tablerevert, end transaction, rollback. Некоторые формы modelless и, соответственно, возможен запуск нескольких экземпляров формы одновременно.

Если в качестве backend выступает сам Visual Foxpro, то видимость транзакции ограничивается data session и rollback в одной из них не влияет на выполнение транзакций в других datasession.


Что будет происходить, если в качестве backend выступает SQL Server и используются remote view с shared connection?
Все remote view используют один и тот же Connection Handle и, стало быть, SQLRollBack в одной из форм (data session) будет влиять на выполнение транзакций в других формах (data session)? так ли это? Как можно форсировать выделение отдельного Connection для private data session?

Спасибо
...
Рейтинг: 0 / 0
Транзакции в private data session
    #32175460
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приче тут PDS?
Транзакция начинается на сервере для данного соединения...
Чтобы вью открывалось в отдельном соединении
=DBSETPROP('view1',"VIEW","ShareConnection",.F.)

Вот только вот удерживать открытой транзакцию не очень хорошо . Можно проблемы обрести. Оптимистическая блокировка намного надежнее и проще
...
Рейтинг: 0 / 0
Транзакции в private data session
    #32175468
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то я не то написал?
Если вы вручную открываете транзакцию значит использует SQL Pass Through.
Для отдельной транзакции достаточно еще раз создать соединение.
SQLCONNECT,SQLSTRINGCONNECT
...
Рейтинг: 0 / 0
Транзакции в private data session
    #32175557
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да и в VFP DataSession, тоже никаким боком к транзакции не относится.

Транзакция - это процесс, связанный с базой данных, а уж какой там сеанс данных Private или Default - абсолютно все-равно.

Другое дело, что ты используешь View, т.е. работаешь в режиме оптимистической буферизации. Это значит, кто последний записался тот и прав (если конечно не обрабатываешь конфликты совместного доступа)

Следует помнить, что View (Local или Remote) - это НЕ исходные таблицы. Это временные таблицы, физически расположенные у клиента и являющиеся результатом выполнени SQL-запроса.

При работе с SQL-сервером, если еще используется база данных FoxPro (файл DBC), то следует помнить, что у тебя именно 2 базы данных. Соответсвенно, возможны 2 транзакции - одна собственно на SQL-сервере, а другая в базе VFP. Это следует учитывать при работе.
...
Рейтинг: 0 / 0
Транзакции в private data session
    #32175629
vklepko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А мне чего-то казалось, что dataSession к транзакциям имеет непосредственное отношение. Я ведь могу, К ПРИМЕРУ, запустить 20 экземпляров формы, каждую в private data session и к в каждой начать транзакцию. В default data session этого не получится из-за ограничения по максимальному уровню вложенности транзакций. Следовательно, я предполагаю, что транзакции в VFP живут в мире ограниченным data session. И транзакция из одной data session не знает о транзакциях в других.

Я ожидал, что при использовании remote view, VFP создаст отдельный "мир" для работы с транзакциями на remote backend - для каждой datasession создаст отдельный connect и откроет все remote view из конкретного dataenvironment в этом коннекте, если используестя Shared Connection.

Спасибо.
...
Рейтинг: 0 / 0
Транзакции в private data session
    #32175662
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Private DataSession наиболее близко к еще одному сеансу данных. Т.е. грубо говоря - еще один пользователь.

Да, конечно, с таблицами может работать одновременно и 20 пользователей.

Но ведь ты постараешься максимально избегать ситуаций, когда все эти 20 пользователей одновременно начнут транзакции (точнее это желательно избегать, а уж что именно ты сделаешь...)

У тебя какое-то неправильное представление о цели транзакции.

Транзакция не используется непосредственно при внесении изменений пользователем в экранных формах. Ну то есть при набивке информации. Транзакция применяется только в момент сброса ранее набитой информации непосредственно в таблицы.

Общая стратегия заключается в том, чтобы существование открытой транзакции свести к возможному минимуму и на всем протяжении существования транзакции ни в коем случае не переходить в режим ожидания реакции пользователя.
...
Рейтинг: 0 / 0
Транзакции в private data session
    #32175682
vklepko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я понимаю, что необходимо пытаться минимизировать время между begin transaction и end transaction/rollback. Вопрос не в этом.

Я пытаюсь понять отношения между data session и обработкой транзакций. ПРИМЕР, в котором begin transaction выполняется на Load Event, использовал для выяснения этой связи и к реальной обработке транзакций отношения не имеет. ПРИМЕР показал, что транзакции "живут" в data Session.

Вопрос в другом: является ли private data session аналогом еще одного пользователя с точки зрения обработки транзакций. Когда VFP работает с native данными, то да - транзакция дальше data session не видит и тем более не видит другого пользователя.

Что происходит, когда используются remote view с shared connection?
Если работают различные пользователи, то проблемы нет - они используют различные соединения с точки зрения удалённой СУБД.
А вот если один и тот же пользователь открыл второй экземпляр формы(или другую форму), то с точки зрения backend - это одно и то же соединение, а с точки зрения VFP две различные формы, две различные data session. И если в одной из data session(в одной из форм) выполнить RollBack на удаленных данных, то он распространиться на весь Connect и, следовательно, на несколько data sessions и даже на те, в которых все модификации прошли удачно и оставалось выполнить лишь Commit.
В результате, все TableUpdate пройдут успешно, Commit пройдёт успешно, а модификации данных не произойдет - RollBack из другой data session, но на том же Connection, выполнился на мгновения раньше, чем Commit.

Получается, что private data session не совсем private для remote view?
Можно ли заставить VFP создавать отдельный Connection для каждой data session и потом форсировать открытие view из dataEnvironment через этот Connection?

Спасибо
...
Рейтинг: 0 / 0
Транзакции в private data session
    #32175833
Фотография 1024
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты скажи толком чё надо в конечном итоге получить.
...
Рейтинг: 0 / 0
Транзакции в private data session
    #32175888
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PDS (private datasession ) относится к фоксовым таблицам , базам и рабочим областям.
Транзакции же выполняются в рамках соединения, так как работают непосредственно с сервером.
Проблема тут в другом. На фига тебе отдельное соединение и транзакция для ремоут вью? Они по определению открываются в оптимистической блокировке. Если нужно провернуть транзакцию, то просто создай новое соединение в нужной форме с помощью sqlconnect,sqlstringconnect.
Не надо путать 2 разные технологии доступа к данным из фокса - REMOTE VIEW и SQL Pass Through .
Вывод:
1)Транзакции возможны только при использовании SQL Pass Through .
2)При работе Remote View не используются транзакции вообще. (Оптимистическая блокировка).
3) Для создания новой транзакции создавай новое соединение с помощью sqlconnect,sqlstringconnect
Надеюсь я понятно объяснил
...
Рейтинг: 0 / 0
Транзакции в private data session
    #32176023
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажется дошло, о чем ты спрашиваешь ;)

Проверить количество установленных коннектов к серверной базе данных можно визуально в Enterprise Manager. В дереве это "Мой SQL Сервер"->Management->Current Activity->Process Info. Только не забывай обновлять картинку - Правой кнопкой мыши на Current Activity->Refresh

Специально не проверял, но сильно сомнительно, что при shared connection в Private DataSession будут создаваться отдельные соединения.

Кроме того, как правило, в последних версиях MS SQL количество возможных коннектов ограничено. И если плодить коннекты на каждую сессию, то ты рискуешь вылететь за предельно допустимое число коннектов.

Насчет управляемости Connection в VFP6.

Как раз в 6 версии, если работа происходит через Remote View существующие Connection практически неуправляемые. В более поздних версиях предпринята попытка повысить управляемость, но насколько она успешна я не знаю.

Т.е. через DataEnvironment крайне сложно что-то сделать. Можно поиграться настройками DBSetProp() для динамической модификации Connection и Remote View ДО их открытия, но такой подход означает модифкацию файла базы данных (DBC), что мне представляется не очень хорошей идеей (впрочем, можно создавать временную базу данных перед открытием формы и удалять ее после закрытия)
...
Рейтинг: 0 / 0
Транзакции в private data session
    #32176933
vklepko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 1024
В конечном итоге хочу получить отдельный ConnectionHanlde для каждой data session и заставить VFP открывать remote view из этого data session используя этот ConnectionHandle.

Спвсибо
...
Рейтинг: 0 / 0
Транзакции в private data session
    #32176935
vklepko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 ВладимирМ
Спасибо. Я поиграюсь/поэкспериментирую может чего выкрутить получиться...

Относительно модификации Connection в RemoteView/создания временной локальной базы тоже подумаю. Хотя как и Вам мне кажется, что использование такого подхода, не совсем удачное решение.

Есть ли какой-либо способ влезть в SQLConnect?

Спасибо.
...
Рейтинг: 0 / 0
Транзакции в private data session
    #32176956
vklepko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Crip
Прошу прощения,но я Вас не совсем понял.

Когда Вы употребляете выражение "Оптимистическая блокировка", то имеется ввиду "row/table buffering" из VFP или некая другая блокировка, возникающая на удалённой СУБД?

Что Вы имеете ввиду утверждая, что транзакции возможны только при использовании SQL Pass Through? Установите, К ПРИМЕРУ, в VFP ручной режим управления транзакциями и откройте RemoteView - у Вас открытая транзакция.При желании её можно тут же закрыть SQLRollback(CursorGetProp("connectionHanlde")).
Выполните CursorSetProp("buffering",5)- table buffering. Выполните Browse. Поизменяйте чего либо в данных(remoteview должен быть updatable).
Выполните TableUpdate(1,.f.) - на удалённой СУБД прошли insert/update/delete(в зависимости от действий в Browse.), которые повлекли за собой при необходимости неявное начало транзакции. Осталось транзакцию закрыть.
Выполните SQLCommit(CursorGetProp("connectionHanlde")).
С моей точки зрения, несмотря на использование SQLCommit и SQLRollback, которые относятся к SQL Pass Through функциям, в этом примере используется технология RemoteView - в Remote View описаны поля, таблицы, ключи, тип апдейта.

Спасибо
...
Рейтинг: 0 / 0
Транзакции в private data session
    #32176961
Фотография 1024
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2vklepko

Код: plaintext
1.
2.
3.
В конечном итоге хочу получить отдельный ConnectionHanlde для 
каждой data session и заставить VFP открывать remote view из 
этого data session используя этот ConnectionHandle. 


Так ты и скажи зачем тебе это. По-моему ты где-то не там плаваеш.
...
Рейтинг: 0 / 0
Транзакции в private data session
    #32177046
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То что вы говорите это очевидно...
Проблема в другом...

1)Что вы хотите сделать? Откатывать TableUpdate?
Тогда установить ручной режим транзакций прямо перед ним... Commit или Rollback, а потом обратно в автоматический.

2)Что я понимаю по оптимистической блокировкой? А то что курсор на клиенте(фоксе) он имеет тип Static, то есть snapshot(по состоянию на момент requery()). Записи попавшие в него не блокируются сервером. Поэтому транзакцию имеет смысл начинать только перед внесением изменений в базу и там же ее заканчивать..

Лично я вообще View не пользуюсь , а просто делаю обычный SPT курсор обновляемым (для этого написан класс) и проблем с установкой нужного соединения у меня нет..
...
Рейтинг: 0 / 0
Транзакции в private data session
    #32177073
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Беру свои слова обратно по поводу не блокируются сервером...
Если транзакция открыта и установлен соответствующий уровень изоляции,то записи должны блокироваться...
Другое дело , что при этом будут чувствовать другие юзеры...

Вообщем мой совет таков:
Либо отказаться от удержания транзакций, либо отказаться от view
...
Рейтинг: 0 / 0
Транзакции в private data session
    #32177892
vklepko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Crip

1)Что вы хотите сделать? Откатывать TableUpdate?
Да нет, хотел сказать, что транзакции возможны не только при использовании технологии SQL Pass Through, но и при использовании технологии Remote View.

Относительно блокировок на удалённой БД: мне видится, что блокировки совершенно одинаковые, при прочих равных условиях, будь то SELECT выполненный через SQL Pass Through или SELECT выполненный в результате открытия/requery remote view. Или БД знает, что это SELECT выполняется через SQL Pass Through и как-то по особому его обрабатывает? Сомневаюсь

У меня по ходу возник практический вопрос: как поле типа datetime на удалённой БД замэпить в VFP поле типа date с использованием технологии SQL Pass Through? Как управлять типами полей в результируещем курсоре при использовании SQL Pass Through?

Спасибо
...
Рейтинг: 0 / 0
Транзакции в private data session
    #32178097
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1)Нет конечно никакой разницы как выполняется запрос...
2)С типами да...Есть проблемы конечно...
CursorAdapter из VFP8 их решает
...
Рейтинг: 0 / 0
Транзакции в private data session
    #32178101
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Упс...Опять чуть-чуть промазал... Слышал отзывы о CursorAdapter. Говорили что datetime он в date не конвертит... Но это вообщем-то глюк...
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Транзакции в private data session
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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