Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Работа СА в режиме буферизация и транзакции / 15 сообщений из 15, страница 1 из 1
31.10.2013, 16:03
    #38448593
VIVA_CA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа СА в режиме буферизация и транзакции
Уважаемые коллеги!
Помогите в боле полном объеме разобраться во взаимодействиях СА – буферизация – транзакции.
На одном из обсуждений этой темы уважаемый Генетический мусор утверждает (других источников у меня нет) В клиент-серверных системах буферизация не нужна”.

Известно что: 1. СА – всегда буферизирован
2. СА – может работать как в режиме транзакций та и без

При схеме работы VFP9-CA-ODBC-MySQL:
Обновляются данные на стороне клиента через REPLACE, Insert, Append, а также на прямую в Гриде и форме через textbox.

1.Является ли такая схема полноценным клиент-серверным приложением?
2.Что означает “ в клиент-серверных системах буферизация не нужна “ -
на уровне МуSql или полученного курсора?
3.Проскакивают советы - для снижения вероятности потерь данных при обновлении на сервере использовать транзакции на полученный курсор.
4.Как увязать СА и хранимые процедуры на МуSql? – и если можно пример
...
Рейтинг: 0 / 0
31.10.2013, 17:11
    #38448741
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа СА в режиме буферизация и транзакции
VIVA_CAУважаемые коллеги!
Помогите в боле полном объеме разобраться во взаимодействиях СА – буферизация – транзакции.
На одном из обсуждений этой темы уважаемый Генетический мусор утверждает (других источников у меня нет) В клиент-серверных системах буферизация не нужна”.

Известно что: 1. СА – всегда буферизирован
2. СА – может работать как в режиме транзакций та и без

При схеме работы VFP9-CA-ODBC-MySQL:
Обновляются данные на стороне клиента через REPLACE, Insert, Append, а также на прямую в Гриде и форме через textbox.

1.Является ли такая схема полноценным клиент-серверным приложением?
2.Что означает “ в клиент-серверных системах буферизация не нужна “ -
на уровне МуSql или полученного курсора?
3.Проскакивают советы - для снижения вероятности потерь данных при обновлении на сервере использовать транзакции на полученный курсор.
4.Как увязать СА и хранимые процедуры на МуSql? – и если можно пример

1. Любой курсор полученный со "взрослого" сервера имеет буфферизацию.

2. ЛЮБАЯ модификация данных на сервере происходит в транзакции, независимо от того выдали мы явно begin tran или нет.

3. Правильно советуют, ЛЮБУЮ (атомарную) модификацию данных необходимо проводить в транзакции.

4. В SelectCmd, InsertCmd ... необходимо писать вызов ХП, те вместо:

Код: sql
1.
SelectCmd = 'select * from Mytable'



надо написать

Код: sql
1.
SelectCmd = 'exec MyStoreProc'
...
Рейтинг: 0 / 0
31.10.2013, 21:52
    #38449018
Березовский
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа СА в режиме буферизация и транзакции
PaulWist , +100500
...
Рейтинг: 0 / 0
01.11.2013, 09:49
    #38449335
VIVA_CA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа СА в режиме буферизация и транзакции
Уважаемый PaulWist - благодарю за почти исчерпывающий ответ!

2. ЛЮБАЯ модификация данных на сервере происходит в транзакции, независимо от того выдали мы явно begin tran или нет.

А буферизация на самом сервере есть или транзация включает в себя механизм буферизации?
...
Рейтинг: 0 / 0
01.11.2013, 11:05
    #38449463
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа СА в режиме буферизация и транзакции
VIVA_CAУважаемый PaulWist - благодарю за почти исчерпывающий ответ!

2. ЛЮБАЯ модификация данных на сервере происходит в транзакции, независимо от того выдали мы явно begin tran или нет.

А буферизация на самом сервере есть или транзация включает в себя механизм буферизации?

Давайте отделим "мух от котлет".

Дано:

1. Клиент, который каким-то образом получил курсор с сервера (SPT, RV, CA) , этот курсор является локальной "табличкой" на компе клиента.

2. Сервер БД на котором лежат таблички с данными.

На клиенте полученный курсор имеет либо 3 либо 5 буфферизацию.

Чем они отличаются друг от друга:

- при 3 буфферизации происходит АВТОМАТИЧЕСКИЙ сброс данных в таблицы сервера, при переходе с записи на запись внутри локального курсора, те если мы имеем курсор из 10 записей, стрелкой вниз прошли от записи 1 до записи 5 (на 5-ой остановились) , то фокс сформирует ЧЕТЫРЕ команды на обновление данных и создаст ЧЕТЫРЕ транзакции для каждой строчки.

Для 5-ой строчки, если необходимо её модифицировать надо выдать явную команду TableUpdate().

В этом случае на сервере обновятся 5 записей.

- что происходт при 5-ой буфферизации, если проделать такие же переходы что в первом примере, то на сервер НЕ ПЕРЕДАСТСЯ ни одной команды на модификацию, что бы нам обновить 5 строчек надо будет выдать команду TableUpdate().

Что произойдёт в этом случае, фокс так же как и в первом случае сгенерит 5-ть отдельных транзакций для каждой записи.

НО и первый и второй случай нельзя использовать в prodaction, .... почему, да потому, что для сохранения 5 записей произойдёт 5 изолированных друг от друга транзакций, и если возникнет ошибка скажем на 2-ой записи, то на сервере и в первом и во втором случае обновятсят ТОЛЬКО 4 записи.

Что бы такого избежать, те что бы мы были уверены, что на сервере обновятся ВСЕ пять записей или не одной, необходимо TableUpdate обернуть в "клиентскую" транзакцию:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
* устанавливаем ручное закрытие транзакции
SQLSETPROP(hndConnection,"Transactions",2)

if TableUpdate()
** всё хорошо
else 
** если случилась ошибка
** например сработало правило поля
** откатываем транзакцию на сервере
	SQLROLLBACK(hndConnection)
** переводим соединение в автоматический режим
 
             SQLSETPROP(hndConnection,"Transactions",1)
** выводим сообщение об ошибке
messagebox()
** возвращаем управление вызывающей программе или методу
Return .f.
 endif 

* Завершаем ручную транзакцию
IF SQLCOMMIT(hndConnection) = 1

ELSE
** если случилась ошибка, например сработал триггер 
** откатываем транзакцию
	SQLROLLBACK(hndConnection)
ENDIF 
** переводим соединение в автоматический режим
SQLSETPROP(hndConnection,"Transactions",1)



При такой схеме наши пять записей будут либо записаны на сервер, либо всё будет отвергнуто и состояние таблички не изменится.
...
Рейтинг: 0 / 0
01.11.2013, 14:53
    #38450041
VIVA_CA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа СА в режиме буферизация и транзакции
Оченнь благодарен за такой развернутый ответ!

НО и первый и второй случай нельзя использовать в prodaction, .... почему, да потому, что для сохранения 5 записей произойдёт 5 изолированных друг от друга транзакций, и если возникнет ошибка скажем на 2-ой записи, то на сервере и в первом и во втором случае обновятсят ТОЛЬКО 4 записи.

1. Почему обновятся 4 записи а не 1 - 1-я?

2. И для ликбеза расшифруйте SPT,RV, prodaction

Прошу ответить!
...
Рейтинг: 0 / 0
01.11.2013, 15:12
    #38450073
VIVA_CA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа СА в режиме буферизация и транзакции
И еще:

поиск d локальном курсоре типа locate при буфферизации=3 тоже заставит каждую запись на сервере обновиться?
...
Рейтинг: 0 / 0
01.11.2013, 15:17
    #38450086
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа СА в режиме буферизация и транзакции
VIVA_CAОченнь благодарен за такой развернутый ответ!

НО и первый и второй случай нельзя использовать в prodaction, .... почему, да потому, что для сохранения 5 записей произойдёт 5 изолированных друг от друга транзакций, и если возникнет ошибка скажем на 2-ой записи, то на сервере и в первом и во втором случае обновятсят ТОЛЬКО 4 записи.

1. Почему обновятся 4 записи а не 1 - 1-я?

2. И для ликбеза расшифруйте SPT,RV, prodaction

Прошу ответить!

1. Я взял крайний случай, когда происходит либо косвенный TableUpdate, либо TableUpdate при 5-ой буфферизации когда не анализируется возвращаемое значение ф-ии TableUpdate, те фокс вернув ошибку продолжит производить обновление данных сервера, если его не остановить "руками".

При условии, что ошибка возникнет на второй записи и мы это определили, то произойдёт обновление только первой записи, НО это нам не надо, поскольку нарушается атомарность сохранения либо всё, либо ничего.

2.

SPT - SQL Pass Through, работа с сервером через ф-ии SQLEXEC() итп (см раздел хелпа Visual FoxPro SQL Pass-Through Functions )

RV - Remote view, удалённые представления (так же смотри хелп)

prodaction - вернее production, те работа клиента с сервером, который обслуживает реальные бизнес процессы (например, считается зарплата ) .
...
Рейтинг: 0 / 0
01.11.2013, 15:20
    #38450091
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа СА в режиме буферизация и транзакции
VIVA_CAИ еще:

поиск d локальном курсоре типа locate при буфферизации=3 тоже заставит каждую запись на сервере обновиться?

В общем случае ДА, конечно же можно настроить, что бы не обновлялось, например добавить обновление по timestamp, в этом случае сервер будет проверять есть ли изменения от других пользователей, если нет, то обновления не буде, НО лучше этого не делать, лучше управлять транзакциями в "ручную".
...
Рейтинг: 0 / 0
01.11.2013, 16:13
    #38450196
VIVA_CA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа СА в режиме буферизация и транзакции
PaulWist, я Вам оченнь благодарен за оказанное внимание.
...
Рейтинг: 0 / 0
06.11.2013, 14:43
    #38454566
VIVA_CA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа СА в режиме буферизация и транзакции
Подскажите пожалуйста! Как отследить ситуацию?

Схема та же: VFP9-CA- ODBC-MySQL

if !tableupdate(.t.,.t.,'MyTable').
=sqlrollback(My_soed)
aerror(laErrors)
messagebox(iif(type('laErrors[2]')='C',laErrors[2],'Неопознанная ошибка!'),16,'Ошибка')
endif

Не выдает ошибку, но данные на сервере не обновляются
Причин естественно много, но как их диагностировать на этапе выполнения?
...
Рейтинг: 0 / 0
06.11.2013, 14:51
    #38454589
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа СА в режиме буферизация и транзакции
VIVA_CAПодскажите пожалуйста! Как отследить ситуацию?

Схема та же: VFP9-CA- ODBC-MySQL

if !tableupdate(.t.,.t.,'MyTable').
=sqlrollback(My_soed)
aerror(laErrors)
messagebox(iif(type('laErrors[2]')='C',laErrors[2],'Неопознанная ошибка!'),16,'Ошибка')
endif

Не выдает ошибку, но данные на сервере не обновляются
Причин естественно много, но как их диагностировать на этапе выполнения?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
if !tableupdate(.t.,.t.,'MyTable'). 
  aerror(laErrors)
for i = 1 to alen(laErrors)
?laErrors(i)
endfor 
  =sqlrollback(My_soed)
  messagebox(iif(type('laErrors[2]')='C',laErrors[2],'Неопознанная ошибка!'),16,'Ошибка')
endif



Проверь на тестовом коде.
...
Рейтинг: 0 / 0
06.11.2013, 15:09
    #38454630
VIVA_CA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа СА в режиме буферизация и транзакции
Это почти тоже самое т.к. tableupdate()=.t. а данные не обновились
...
Рейтинг: 0 / 0
06.11.2013, 15:42
    #38454700
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа СА в режиме буферизация и транзакции
VIVA_CAЭто почти тоже самое т.к. tableupdate()=.t. а данные не обновились

Ну зеачит смотри как у тебя курсор настроен, похоже SendUpdate = .f.
...
Рейтинг: 0 / 0
06.11.2013, 16:12
    #38454758
VIVA_CA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа СА в режиме буферизация и транзакции
спасибо за участие!
свою ошибку я знаю - это не соответствие ключевого поля в курсоре и на сервере на момент обновления, но как их диагностировать такую ситуацию на этапе выполнения чтобы корректно обработать в программе? tableupdate не видит этой разницы - не находит и следовательно не обновляет
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Работа СА в режиме буферизация и транзакции / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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