|
|
|
Сохранение отложенных изменений при многопользовательской работе
|
|||
|---|---|---|---|
|
#18+
Добрый день! Помогите разобраться со следующей проблемой: например, 2 пользователя работают с одной записью, 1ый вносит изменения, нажимает кнопку Сохранить, в БД происходят сохранения, все ок! 2ой пользователь пытается изменить ту же запись (дополнить своей информацией, а дополнить он должен - таково задание). При этом, когда он нажимает Сохранить вылетает exception с сообщением о том что запись уже изменена (версия записи dataSet не соответстует версии в БД). Я прочитал про различные стратегии обновления данных и понял, что мне подходит Оптимистическая стратегия, которая в принципе используется по-умолчанию. Подскажите как правильно решить проблему конкуренционного обновления данных! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2006, 13:53 |
|
||
|
Сохранение отложенных изменений при многопользовательской работе
|
|||
|---|---|---|---|
|
#18+
Оптимистическая стратегия проверят соответсвие полей в базе данных. Это понятно. Так вот - автоматом дизайнер подстваляет все поля для проверки. Нипиши сам адаптер в котором укажи только нужные поля для проверки. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2006, 15:10 |
|
||
|
Сохранение отложенных изменений при многопользовательской работе
|
|||
|---|---|---|---|
|
#18+
Спасибо за ответ, но как я понял это уже стратегия по принципу "последний победивший".. Т.е. запись, внесенная последним пользователем, будет отображена в БД, а предыдущее ее состояние будет перезаписано, кроме ключевый полей. Я правильно понял? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2006, 15:30 |
|
||
|
Сохранение отложенных изменений при многопользовательской работе
|
|||
|---|---|---|---|
|
#18+
Точно, я на путал. Реализация оптимистической зависти от БД. Какая у Вас? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2006, 15:48 |
|
||
|
Сохранение отложенных изменений при многопользовательской работе
|
|||
|---|---|---|---|
|
#18+
sql server 2000 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2006, 15:49 |
|
||
|
Сохранение отложенных изменений при многопользовательской работе
|
|||
|---|---|---|---|
|
#18+
http://www.zarech.ru/develop/Public/PessimisticLocking.asp ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2006, 15:56 |
|
||
|
Сохранение отложенных изменений при многопользовательской работе
|
|||
|---|---|---|---|
|
#18+
предудущий исходник - это оптимистеческая, в статье пессимистическая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2006, 15:57 |
|
||
|
Сохранение отложенных изменений при многопользовательской работе
|
|||
|---|---|---|---|
|
#18+
дело, как я понимаю, не в описании запроса Update. оптимистическая стратегия вылетает эксепшеном, мне нужно правильно отреагировать, т.е. не писать типа MessageBox.Show("Запись изменена др. польз-м") и заливать методом Fill все данные заного, а внести изменения в БД, но не затирая тех данных, что добавил др. юзер, чтоб юзер не почувствовал никаких проблем (для него это должно быть прозрачно). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2006, 16:09 |
|
||
|
Сохранение отложенных изменений при многопользовательской работе
|
|||
|---|---|---|---|
|
#18+
пас, совсем не понятно что тебе нужно. ExecuteNonQuery - будет "последний победивший" (это так, к примеру). Если же ты хочешь обновить только те поля которые не изменены пользователем, то имхо нужно писать уже анализатор(тогда карты в руки и вперед - оригинальный значения у тебя есть, сравниваешь оригинальное значение со значениеми из базы, если равно апдейтишь, а нет - ну на нет и суда нет:) ). Вообщем не совсем понятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2006, 16:31 |
|
||
|
Сохранение отложенных изменений при многопользовательской работе
|
|||
|---|---|---|---|
|
#18+
Вы сталкивались с проблемой многопользовательского доступа в бд, когда Вы хотите изменить запись, а она уже изменена другим пользователем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2006, 16:34 |
|
||
|
Сохранение отложенных изменений при многопользовательской работе
|
|||
|---|---|---|---|
|
#18+
если да, то как Вы ее решали? Полной перезаписью что-ли? я поясню, у меня программа должна автоматизировать процесс исполнения поручений на предприятии. пользователям руководство говорит, что нужно сделать, на одно поручение может быть несколько пользователей. после исполнения поручения, юзеры пишут руководству отчет о проделанной работе (поле в таблице Результат). так вот мне нужно, чтобы это поле могли дополнять информацией все пользователи, которым поручено выполнить данное поручение. информация в dataSet загружается один раз при запуске программы, по мере сохранения изменений данные передаются в бд. если 1 юзер изменит содержимое поля Результат и в этот же день, например, 2 юзер тоже захочет добавить своей информации, то генерируется исключение DBConcurrencyException. Как быть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2006, 16:48 |
|
||
|
Сохранение отложенных изменений при многопользовательской работе
|
|||
|---|---|---|---|
|
#18+
С такой задачей не приходилось сталкиваться. Но вижу это так. Перед обновлением блокируешь нужную запись в таблице, Модифицируешь свой Результат = Select Результат из базы + Результат, апдейтишь, разблокируешь. Все в одной транзакции. А для того что бы избавиться от DBConcurrencyException перепиши адаптер как я и показывал. Хотя реально причина Exception может быть в другом. Например когда ты обновляешь в не том порядке связанные таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2006, 17:02 |
|
||
|
Сохранение отложенных изменений при многопользовательской работе
|
|||
|---|---|---|---|
|
#18+
хорошо, попробую.. спасибо, что пытался помочь! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2006, 17:06 |
|
||
|
Сохранение отложенных изменений при многопользовательской работе
|
|||
|---|---|---|---|
|
#18+
mix451если да, то как Вы ее решали? Полной перезаписью что-ли? я поясню, у меня программа должна автоматизировать процесс исполнения поручений на предприятии. пользователям руководство говорит, что нужно сделать, на одно поручение может быть несколько пользователей. после исполнения поручения, юзеры пишут руководству отчет о проделанной работе (поле в таблице Результат). так вот мне нужно, чтобы это поле могли дополнять информацией все пользователи, которым поручено выполнить данное поручение. информация в dataSet загружается один раз при запуске программы, по мере сохранения изменений данные передаются в бд. если 1 юзер изменит содержимое поля Результат и в этот же день, например, 2 юзер тоже захочет добавить своей информации, то генерируется исключение DBConcurrencyException. Как быть? создай таблицу отчетов и будет тебе счастье:) и пускай каждый редактирует свой отчет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2006, 19:03 |
|
||
|
Сохранение отложенных изменений при многопользовательской работе
|
|||
|---|---|---|---|
|
#18+
какая таблица отчетов? у меня есть таблица Orders, которая содержит все атрибуты док-та (приказы, поручения, распоряжения, ...) - вот ее и редактируют пользователи (рег.номер док-та, даты различные, содержание, рез-т выполнения, примечание, ...). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2006, 19:15 |
|
||
|
Сохранение отложенных изменений при многопользовательской работе
|
|||
|---|---|---|---|
|
#18+
mix451 .... различные стратегии обновления данных и понял, что мне подходит Оптимистическая стратегия, которая в принципе используется по-умолчанию. Подскажите как правильно решить проблему конкуренционного обновления данных! .... Много чего здесь написали в основном не по делу. OFF: если в топе приведены ссылки на организацию пессимистического управления блокировками, то следует дать ссылку на тему от 23 февраля: http://www.sql.ru/forum/actualthread.aspx?tid=265284 Что касается оптимического управления блокировками, 1) то что предлагает мастер-конфигуратор DataAdapter использовать нельзя. По всей видимости проблема автора топа. 2) Если в where оставить только id, то как уже отмечалось это приведет к потере данных - работает принцип - "Кто последний тот и папа" :-) 3) Для MS SQL можно пойти путем использования поля типа timestamp - в поле этого типа содержатся данные уникальные в пределах БД и значения этого поля изменяется при каждом его обновлении . Следовательно, добавив timestamp в where (id, и timestamp) мы предотвратим перезапись изменений другого юзера и вышеописанный принцип про "папу" уже не сработает. Резюме: Для разрешения возможных конфликтов параллельного изменения данных в вашем приложении при использовании MS SQL 2000 см. в сторону timestamp. Код: plaintext Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2006, 07:35 |
|
||
|
Сохранение отложенных изменений при многопользовательской работе
|
|||
|---|---|---|---|
|
#18+
Дык он спрашивает о разруливании конфликта. Timestamp это средство обнаружения конфликта, но есть и другие. Насколько я понимаю в стандартных MS DataSet все не очень хорошо с этим. Очень им далеко до Midas. Борланд выкатил новые BDPProvider с улучшенной поддержкой. Ну начать можно отсюда http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndive/html/data11082001.asp Все как обычно нужно копаться в полях после обновления, сравнивать значения и перечитывать записи. Потом их обновлять повторно, если запись изменилась на сервере. Кажется даже есть готовые методы фильтрации для этих целей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2006, 17:58 |
|
||
|
|

start [/forum/topic.php?fid=17&msg=33612781&tid=1353389]: |
0ms |
get settings: |
6ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
54ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 207ms |
| total: | 329ms |

| 0 / 0 |
