Клиент-сервер

Varia
Дата: 24.01.2010 19:04:48
Пишу клиент-серверное приложение, возник вопрос:
как должна реагировать программа, если один пользователь редактирует запись, а другой её в это время удаляет?

Пишу на С#, база данных — MS SQL Server

Заранее спасибо.
D129
Дата: 24.01.2010 20:57:03
Varia
Пишу клиент-серверное приложение, возник вопрос:
как должна реагировать программа, если один пользователь редактирует запись, а другой её в это время удаляет?

Пишу на С#, база данных — MS SQL Server

Заранее спасибо.

В принципе - неразрешимая задача.
Как-то решаться может в момент открытия окна с этой записью - например - кто первый открыл - тот и будет главный, остальные - не смогут сохранить ничего.
ZhV
Дата: 25.01.2010 00:24:36
Если ваш проект на самых ранних стадиях, могу предложить один вполне проверенный "защищенный" вариант.
Запись не удаляется физически, а "аннулируется" специальным флажком (рекомендую название поля - isdeleted) - что-то типа "корзины". Из корзины всегда можно вытащить ошибочно удаленные обьекты.
Ну и раз в неделю/месяц - "большая приборка" корзинного мусора админовскими средствами по специальному регламенту.
Этот вариант очень хорош для приложений с юридически жестким регламентом - например поступающие заявки нельзя удалить - только мотивированно аннулировать.

Isdeleted-вариант - единственно возможный, если речь идет о справочниках - констрэйнты просто не дадут удалить позицию с многочисленными ссылками на всякие архивные записи состоявшихся в былые времена операций. Например, какой-то клиент больше "не клиент" => isdeleted=true - и он больше не будет мозолить глаза во всяких выпадающих списках, но все "старые связи" останутся целы.

Самый известный пример такого решения - 1С.
aleks-sam
Дата: 25.01.2010 05:05:53
И не забывайте о транзакциях.
Varia
Дата: 25.01.2010 07:33:33
aleks-sam
И не забывайте о транзакциях.

???
aleks-sam
Дата: 25.01.2010 10:10:12
Varia
aleks-sam
И не забывайте о транзакциях.

???

Ну например есть поле в табличке которое отвечает за то, что запись уже занята кем то. Так вот хранимая процедура, которая отвечает за проверку и "захват" записи в таблице, должна завернута внутри себя в транзакцию. (transaction, commit, rollback)