LINQ to SQL и проблемы параллелизма - PullRequest
7 голосов
/ 10 октября 2008

Мы пытаемся создать систему регистрации заказов большого объема. Есть три основных таблицы: 1. Заказы 2. OrderDetails 3. Заказ отгрузки

Таблица Отгрузка содержит n записей для каждого заказа, и любая запись об отправке может быть изменена до того, как Клиент примет этот заказ, после чего он будет заморожен. (Бизнес-требование)

Хотя это может не произойти в реальных сценариях ... во время наших нагрузочных тестов мы получаем исключения System.Data.Linq.ChangeConflictException. Завершение отправки внутри транзакции также не помогает. Разве мы не можем заставить LINQ блокировать строку на весь период операции обновления?

Есть ли другой способ преодолеть это?

Ответы [ 3 ]

7 голосов
/ 10 октября 2008

Если у вас есть подлинные проблемы с одновременным обновлением одних и тех же данных, то вы можете рассмотреть возможность выполнения всей операции в транзакции, то есть получения данных и , фиксирующих их. Пока вы воспринимаете get / update / commit как недолговечную атомарную операцию (т.е. вы не приостанавливаете ввод данных в середине), все должно быть в порядке.

В частности, с сериализуемым уровнем изоляции никто не может обновлять данные, к которым у вас есть блокировка чтения (т.е. все, что вы запросили). Единственная проблема заключается в том, что это может привести к тупиковым сценариям, если разные запросы читают данные в разных порядках. AFAIK, нет способа заставить LINQ-to-SQL выдать подсказку (UPDLOCK), что является позором.

Подойдет либо TransactionScope, либо SqlTransaction, если они установлены в качестве сериализуемой изоляции (по умолчанию для TransactionScope).

1 голос
/ 13 октября 2008

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

Использование блокировок БД для решения логической блокировки данных представит вам кучу новых проблем. Лучшее решение - это иметь столбцы и / или таблицы, в которых вы можете указать, что заказ / клиент / и т. Д. Редактируется [пользователем], до тех пор, пока он не заблокирован и т. Д. Запросите эту таблицу (или столбцы), чтобы проверить, является ли клиент / Порядок / вещь доступна для редактирования, прежде чем позволить другому пользователю редактировать его.

См: http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=3984968&SiteID=1

1 голос
/ 10 октября 2008

вы можете посмотреть Entity Framework , который выполняет все как транзакцию. Вот два подкаста, которые также могут быть интересны о Entity Framework.

ДНРТВ - часть 1 - часть 2

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