Долгосрочная транзакция Entity Framework - PullRequest
4 голосов
/ 31 мая 2011

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

Как я могу заблокировать сущность в Entity Framework (C #) 4+, базе данных MS SQL Server 2008?

Заранее большое спасибо!

Ответы [ 2 ]

4 голосов
/ 31 мая 2011

Плохая идея, особенно если у вас много одновременно работающих пользователей. Вы убьете масштабируемость, если заблокируете строки в базе данных.

Лучше обнаружить , сделали ли другие изменения и, если да, сообщить об этом пользователю и позволить ему решить, что делать.

Тип данных timestamp / rowversion является хорошим выбором для поля, чтобы узнать, были ли внесены какие-либо изменения в данные строки.

3 голосов
/ 31 мая 2011

Есть два способа справиться с этими ситуациями:

  • Оптимистичный параллелизм, когда вы разрешаете одновременное редактирование и вставку и перехватываете исключение, если что-то нарушает правила параллелизма. Оптимистичный параллелизм обеспечивается уникальными ограничениями, защищающими вставки одинаковых элементов, и столбцами временных меток / версий строк, защищающими одновременные обновления одного и того же элемента. Если кто-то еще обновит строку, когда текущий пользователь вносит изменения, приложение выдаст OptimisticConcurrencyException во время сохранения, и вам нужно будет разрешить пользователю либо перезаписать другие изменения, либо перезагрузить новые сохраненные данные.

  • Пессимистический параллелизм, когда запись заблокирована на время операции, выполняемой любым клиентом, что не позволяет другим клиентам обновить эту же запись. Пессимистический параллелизм обычно обеспечивается добавлением пользовательских столбцов к вашим таблицам, таких как LockedBy, LockedAt и т. Д. После заполнения этих столбцов никто не может выбрать запись для редактирования. LockedAt может помочь вам реализовать автоматическое истечение срока действия выданных блокировок. Длительные «транзакции EF» не являются длительными транзакциями базы данных.

Ваше первоначальное описание приводит ко второму сценарию, который имеет смысл в некоторых приложениях.

...