nolock / TransactionScope и изоляция моментальных снимков - PullRequest
0 голосов
/ 07 февраля 2012

Следует ли использовать изоляцию моментального снимка вместо nolock / TransactionScope? Снимок выглядит как параметр БД, который применяется к базе данных в целом? Это правильно и означает ли это, что мне не нужно специально кодировать его?

Если я обновлю связанные таблицы, а затем SubmitChanges (), будет ли linq всегда обновлять таблицы в том же порядке?

Спасибо

1 Ответ

2 голосов
/ 07 февраля 2012

Во-первых, NoLock (и ReadUncommitted) чрезвычайно опасны.Подумайте, вы используете транзакции в основном потому, что хотите, чтобы ваши данные были согласованными.Используя NoLock, вы разрешаете грязное чтение ваших данных.Скажем, в вашем приложении очень возможно, что вы читаете наполовину обновленные или наполовину вставленные данные.Ваше приложение (или пользователи) будут принимать решения на основе противоречивых данных.

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

Теперь о порядке.Насколько я понимаю, теоретически не гарантируется, будет ли он всегда иметь один и тот же порядок или нет, но практически это вероятно будет (поскольку ORM обычно имеют только один алгоритм для перечисления сущностей и обнаружения изменений).Но это не очень помогает, потому что даже перечисляет сущности (чтобы найти, что нужно сохранить) в том же порядке, количество типов сущностей может быть разным .Скажем, это A и D в одном сценарии и A, B, D в другом и A, C, D в другом.Теперь это может зависеть от отношений между этими объектами.Скажем, C зависит от D, поэтому фактический порядок будет на самом деле A, D, C, а не A, C, D (и даже здесь не указано, что это не будет D, C, A).Поэтому ретрансляция по этому заказу не вариант.Единственное, что вы можете сделать, чтобы убедиться, что порядок - это вызывать .SaveChanges () после каждого шага, что является неприятным.

Да, вы можете использовать уровень изоляции Snapshot (их два, в основном, любой, попробуйте SnapshotЧитайте совершено).Это значительно уменьшит количество взаимоблокировок в вашей системе, но у этого метода есть свои недостатки.

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

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

Кстати, у Уди Даана есть интересное сообщение в блоге об этом: Несоответствующие данные, низкая производительность или SOA - выберите один

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