Какую оптимистическую схему блокировки вы бы порекомендовали для SQL Server? - PullRequest
0 голосов
/ 14 октября 2008

Я создаю корпоративное приложение с .Net 1.1 и SQL Server 2000. Я использую уровень изоляции для фиксации чтения. Однако изменения в нефункциональных требованиях заставили принять меры против неповторяющихся чтений и фантомов. Я вижу два варианта:

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

  2. Миграция на SQL Server 2005 и использование уровня изоляции моментального снимка. Это избавило бы нас от необходимости переписывать код, но есть несколько проблем: а. Уровень изоляции моментальных снимков неизвестен в .Net 1.1, поэтому мы должны выполнить дополнительную обратную передачу на сервер, чтобы установить его вручную. б. Мы не можем использовать временные таблицы в наших хранимых процедурах, поскольку уровень изоляции моментальных снимков не позволяет вносить изменения в схему базы данных tempdb. Я не уверен, как обойти это.

Любые идеи или предложения более чем приветствуются

Ответы [ 2 ]

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

Я бы посоветовал вам обновить систему до 2005/2008 и включить опцию снятого снимка. После включения он выполняет любую транзакцию, которая запрашивает чтение с фиксацией, использует управление версиями строк вместо блокировок. Он также оказывает меньшее влияние на TempDB, чем полная изоляция моментальных снимков.

Какие проблемы возникают у вас с временными таблицами и снимками? Я могу создавать временные таблицы в изоляции моментального снимка без проблем. Единственное известное мне ограничение - если вы используете глобальные временные таблицы. Для работы глобальных временных таблиц либо в tempDB должен быть включен ALLOW_SNAPSHOT_ISOLATION, либо в запрос необходимо добавить подсказку о блокировке, чтобы изменить оператор на другой уровень изоляции.

0 голосов
/ 14 октября 2008

Некоторые мысли по варианту № 2:

Вам не нужно совершать дополнительную поездку в оба конца на сервер. Я могу придумать 3 различных способа избежать этого, включая предварительное ожидание команды в существующей строке запроса, переход к хранимым процедурам и ее настройку и т. Д.
Кроме того, вы можете обойти SQL Server 2005 и перейти прямо к SQL Server 2008, который уже вышел.

Если вы используете опцию # 1, посмотрите, как использовать тип данных timestamp для вашего столбца versionid.

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