Блокировка перед сохранением с фиксированным режимом параллелизма - PullRequest
0 голосов
/ 09 августа 2011

Я изучаю параллелизм в сочетании с EF4.0 и задаю вопрос об используемой схеме блокировки. Я относительно новичок в программировании в целом и параллелизме в особенности, так что, возможно, я неправильно говорю ... Пожалуйста, держитесь за меня.

Скажем, я настраиваю фиксированный режим параллелизма для свойства номера версии.

Теперь скажите, что я извлекаю запись (сущность) из базы данных (контекст) и редактирую некоторое свойство. Версия увеличивается, и когда SaveChanges вызывается в его контексте. Если текущая версия базы данных (контекста) совпадает с версией исходной записи (сущности), сохранение продолжается, в противном случае исключение OptimisticConcurrencyException вызывается EF.

Теперь меня интересует следующее: между проверкой версий всегда есть небольшой промежуток времени, каким бы маленьким он ни был. Таким образом, теоретически кто-то другой мог просто обновить запись между сравнением и фактическим сохранением, что может привести к повреждению данных.

Как это решить? Такое ощущение, что проблема просто выдвигается вперед.

Ответы [ 2 ]

1 голос
/ 09 августа 2011

Между проверкой версий и обновлением записи нет промежутка времени, потому что команда базы данных выглядит так:

UPDATE SomeTable
SET SomeColumn = 'SomeValue'
WHERE Id = @Id AND Version = @OldVersion

SELECT @@ROWCOUNT 

Проверка и обновление являются одной атомарной операцией. Rowcount вернет 0, если не существует записи с Id = @Id and Version = @OldVersion и этот ноль преобразуется в исключение.

0 голосов
/ 09 августа 2011

Это можно (и, вероятно, возможно) решить, используя подсказки блокировки .

Для SQL Server EF может запрашивать (SELECT) из базы данных WITH UPDLOCK.

Это говорит компоненту Database Engine, что вы хотите прочитать несколько записей, и никто другой не сможет изменить эти записи, пока вы не выполните обновление после этого.

Если вы хотите убедиться в этом сами, посмотрите Sql Server Profiler , который будет показывать вам запросы в режиме реального времени.

Надеюсь, это поможет.

CAVEAT : я не могу точно сказать, что - это способ, которым EF обрабатывает этот сценарий, потому что я не проверял себя, но, конечно, если вы собирались сделать это самостоятельно, это один из способов сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...