Проблема параллелизма в базе данных в приложении .NET - PullRequest
2 голосов
/ 19 мая 2010

Если пользователь A удалил OrderA, в то время как userB изменяет OrderA, то пользователь B сохраняет OrderA, тогда в базе данных нет порядка, который нужно обновить. Моя проблема в том, что нет ошибки! SqlDataAdapter.Update завершается успешно и возвращает «1», указывая, что запись была изменена, когда это не так. Кто-нибудь знает, как это должно работать, спасибо.

Ответы [ 4 ]

1 голос
/ 19 мая 2010

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

Оптимистическая блокировка

По сути, это говорит о том, что вы проверяете значения всех полей во время обновления. Итак, вы говорите, например, предполагая, что при первом чтении записи 1 бар был равен 0:

UPDATE FOO SET BAR=1 WHERE ID=1 AND BAR=0

Идея в том, что если запись изменится, обновление завершится неудачно. Это решит вашу проблему.

1 голос
/ 19 мая 2010

Я также считаю Оптимистичный параллелизм лучшим способом.

Нужно только решить, какое поле базы данных использовать в качестве критерия сбоя обновления. Это зависит от вашей ситуации, но есть один универсальный способ реализовать это. Я лично использую MS SQL Server и поэтому предпочитаю вставлять ненулевые поля rowversion (псевдоним timestamp) во все таблицы базы данных (одно поле на таблицу). Таким образом, каждая строка в вашей таблице будет иметь "rowversion", которая будет обновляться автоматически , если кто-то обновит поле строки. Таким образом, вы просто должны использовать это поле как критерий сбоя обновления. См. Также мой старый ответ Параллельная обработка Sql transactrion для более подробной информации.

ОБНОВЛЕНО : Поскольку вы используете SqlDataAdapter для доступа к базе данных, эти ссылки также могут быть вам интересны:

https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-1050108.html

и в следующем просто найдите DataRowVersion:

http://msdn.microsoft.com/en-us/library/ww3k31w0(VS.71).aspx, http://msdn.microsoft.com/en-us/library/bbw6zyha(VS.80).aspx, http://msdn.microsoft.com/en-us/library/ms971491.aspx, http://msdn.microsoft.com/en-us/magazine/cc163908.aspx

1 голос
/ 19 мая 2010

Когда не работает без сохранения состояния (например, работают веб-сервисы), вы можете попробовать пессимистическую блокировку; больше информации здесь (хотя пример VB): https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-1049842.html

0 голосов
/ 22 марта 2011

Я столкнулся с ситуацией, похожей на вашу. Он включал SqlDataAdapter, SqlCommandBuilder, подключенный к нему, и DataTable объект. Изменения, которые я вносил последовательно, не удалось сохранить, но ошибки не выдали. Оказалось, что один из столбцов в объекте DataTable был назван неправильно. Как только я исправил это, оно начало работать отлично. Я до сих пор не знаю, почему это не вызвало ошибку.

...