|
Работа СА в режиме буферизация и транзакции
|
|||
---|---|---|---|
#18+
Уважаемые коллеги! Помогите в боле полном объеме разобраться во взаимодействиях СА – буферизация – транзакции. На одном из обсуждений этой темы уважаемый Генетический мусор утверждает (других источников у меня нет) В клиент-серверных системах буферизация не нужна”. Известно что: 1. СА – всегда буферизирован 2. СА – может работать как в режиме транзакций та и без При схеме работы VFP9-CA-ODBC-MySQL: Обновляются данные на стороне клиента через REPLACE, Insert, Append, а также на прямую в Гриде и форме через textbox. 1.Является ли такая схема полноценным клиент-серверным приложением? 2.Что означает “ в клиент-серверных системах буферизация не нужна “ - на уровне МуSql или полученного курсора? 3.Проскакивают советы - для снижения вероятности потерь данных при обновлении на сервере использовать транзакции на полученный курсор. 4.Как увязать СА и хранимые процедуры на МуSql? – и если можно пример ... |
|||
:
Нравится:
Не нравится:
|
|||
31.10.2013, 16:03 |
|
Работа СА в режиме буферизация и транзакции
|
|||
---|---|---|---|
#18+
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.
надо написать Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.10.2013, 17:11 |
|
Работа СА в режиме буферизация и транзакции
|
|||
---|---|---|---|
#18+
PaulWist , +100500 ... |
|||
:
Нравится:
Не нравится:
|
|||
31.10.2013, 21:52 |
|
Работа СА в режиме буферизация и транзакции
|
|||
---|---|---|---|
#18+
Уважаемый PaulWist - благодарю за почти исчерпывающий ответ! 2. ЛЮБАЯ модификация данных на сервере происходит в транзакции, независимо от того выдали мы явно begin tran или нет. А буферизация на самом сервере есть или транзация включает в себя механизм буферизации? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 09:49 |
|
Работа СА в режиме буферизация и транзакции
|
|||
---|---|---|---|
#18+
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.
При такой схеме наши пять записей будут либо записаны на сервер, либо всё будет отвергнуто и состояние таблички не изменится. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 11:05 |
|
Работа СА в режиме буферизация и транзакции
|
|||
---|---|---|---|
#18+
Оченнь благодарен за такой развернутый ответ! НО и первый и второй случай нельзя использовать в prodaction, .... почему, да потому, что для сохранения 5 записей произойдёт 5 изолированных друг от друга транзакций, и если возникнет ошибка скажем на 2-ой записи, то на сервере и в первом и во втором случае обновятсят ТОЛЬКО 4 записи. 1. Почему обновятся 4 записи а не 1 - 1-я? 2. И для ликбеза расшифруйте SPT,RV, prodaction Прошу ответить! ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 14:53 |
|
Работа СА в режиме буферизация и транзакции
|
|||
---|---|---|---|
#18+
И еще: поиск d локальном курсоре типа locate при буфферизации=3 тоже заставит каждую запись на сервере обновиться? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 15:12 |
|
Работа СА в режиме буферизация и транзакции
|
|||
---|---|---|---|
#18+
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, те работа клиента с сервером, который обслуживает реальные бизнес процессы (например, считается зарплата ) . ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 15:17 |
|
Работа СА в режиме буферизация и транзакции
|
|||
---|---|---|---|
#18+
VIVA_CAИ еще: поиск d локальном курсоре типа locate при буфферизации=3 тоже заставит каждую запись на сервере обновиться? В общем случае ДА, конечно же можно настроить, что бы не обновлялось, например добавить обновление по timestamp, в этом случае сервер будет проверять есть ли изменения от других пользователей, если нет, то обновления не буде, НО лучше этого не делать, лучше управлять транзакциями в "ручную". ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 15:20 |
|
Работа СА в режиме буферизация и транзакции
|
|||
---|---|---|---|
#18+
PaulWist, я Вам оченнь благодарен за оказанное внимание. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2013, 16:13 |
|
Работа СА в режиме буферизация и транзакции
|
|||
---|---|---|---|
#18+
Подскажите пожалуйста! Как отследить ситуацию? Схема та же: VFP9-CA- ODBC-MySQL if !tableupdate(.t.,.t.,'MyTable'). =sqlrollback(My_soed) aerror(laErrors) messagebox(iif(type('laErrors[2]')='C',laErrors[2],'Неопознанная ошибка!'),16,'Ошибка') endif Не выдает ошибку, но данные на сервере не обновляются Причин естественно много, но как их диагностировать на этапе выполнения? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2013, 14:43 |
|
Работа СА в режиме буферизация и транзакции
|
|||
---|---|---|---|
#18+
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.
Проверь на тестовом коде. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2013, 14:51 |
|
Работа СА в режиме буферизация и транзакции
|
|||
---|---|---|---|
#18+
Это почти тоже самое т.к. tableupdate()=.t. а данные не обновились ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2013, 15:09 |
|
Работа СА в режиме буферизация и транзакции
|
|||
---|---|---|---|
#18+
VIVA_CAЭто почти тоже самое т.к. tableupdate()=.t. а данные не обновились Ну зеачит смотри как у тебя курсор настроен, похоже SendUpdate = .f. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2013, 15:42 |
|
Работа СА в режиме буферизация и транзакции
|
|||
---|---|---|---|
#18+
спасибо за участие! свою ошибку я знаю - это не соответствие ключевого поля в курсоре и на сервере на момент обновления, но как их диагностировать такую ситуацию на этапе выполнения чтобы корректно обработать в программе? tableupdate не видит этой разницы - не находит и следовательно не обновляет ... |
|||
:
Нравится:
Не нравится:
|
|||
06.11.2013, 16:12 |
|
|
start [/forum/topic.php?fid=41&msg=38450041&tid=1582858]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
164ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
others: | 301ms |
total: | 554ms |
0 / 0 |