powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / конфликт обновления
4 сообщений из 4, страница 1 из 1
конфликт обновления
    #33072533
lesha_spb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sql server + vfp. работаю через remote view.
появился вопрос: если один клиент удалил нечто, а другой в это время это меняет, при попытке сохранить изменения будет ошибка. или одну и ту же запись удаляют два пользователя и т.п.
Какие есть пути решения? У меня есть несколько вариантов, но хочится узнать как делают опытные люди
...
Рейтинг: 0 / 0
конфликт обновления
    #33073034
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например, пользователи модифицируют таблицу table = ( id , fld1, fld2)

Код: plaintext
1.
2.
3.
// первый пользователь начал редактирование
select * from db!table where id =  1  into cursor tuple1
// второй пользователь начал редактирование
select * from db!table where id =  1  into cursor tuple2

Теперь возможные стратегии:
1) "кто последний того и тапочки" или без конфликтов:

Код: plaintext
1.
2.
3.
// первый меняет fld1 и fld2
update db!table set fld1 = "1",  fld2 = "1" where id =  1 
// второй перезатирает все что первый наменял - никакого выявления конфликта
update db!table set fld1 = "2",  fld2 = "2" where id =  1 

2) конфликт при изменении хотя бы одного модифицируемого поля:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
// первый меняет fld1, но только в том случае, если с момента начала редактирования оно не менялось другими пользователями
begin transaction
update db!table set fld1 = "1"  where id =  1  and fld1 == tuple1.fld1
if _tally ==  0 
     rollback
     return;
endif
end transaction

// второй поступает также

3) конфликт при изменении любого поля (даже readonly поля) с момента начала редактирования:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
// первый меняет fld1, но только в том случае, если с момента начала редактирования ниодно поле не менялось другими пользователями
begin transaction
update db!table set fld1 = "1"  where id =  1  and fld1 == tuple1.fld1 and fld2 == tuple1.fld2
if _tally ==  0 
     rollback
     return
endif
end transaction

На уровне REMOTE VIEW фокс поддерживает эти стратегии выявления конфликтов + анализ timestamp.

Выбирай, что тебе подходит под логику твоего приложения и удачи!
...
Рейтинг: 0 / 0
конфликт обновления
    #33073086
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, к чему это я все? :D

Чтобы выявить конфликт необходимо вводить фиктивное поле - признак удаления. Это поле есть и в фоксе - 0 поле, доступ к которому идет через функцию deleted() и модифицируется через команду delete.
...
Рейтинг: 0 / 0
конфликт обновления
    #33073379
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, вобщем, все правильно. Только в RemoteView все то, что написал Анатолий происходит неявно. Скрыто от пользователя.

По команде TableUpdate(), а при строковой буферизации View просто при попытке перехода на другую запись, предпринимается попытка сброса буфера.

Если сброс буфера не удался, то TableUpdate() вернет .F.

Далее по AERROR() уточняем причину отказа. Сейчас не могу сказать точно, но посмотри какой именно код и сообщение об ошибке вернет сервер, если изменяемая запись была удалена другим пользователем.

Ну, и соответствующее сообщение пользователю: мол пока Вы тут чаи распевали Вашу запись уже удалили.

В общем, "стандартная" стратегия - это разрешение конфликтных ситуаций при попытке сброса изменений на сервер. Все равно ведь одновременной модификации не может быть в принципе. Ни один сервер этого не допустит.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / конфликт обновления
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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