2013-10-14 3 views
-1

У меня есть требование сохранить/обновить данные в 15 таблицах. Я должен убедиться, что во время обновления необходимо поддерживать параллелизм и блокировку, чтобы не происходило никакого грязного чтения. Я обновляю данные с помощью хранимой процедуры. Что я могу сделать в oredr для реализации блокировки и параллелизма?Параллельность, блокировка в базе данных SQL Server

+1

Я думаю, что первым шагом было бы сделать поиск Google на нем и прочитать об этом. Затем, когда у вас есть конкретные вопросы о его реализации, вы должны вернуться к переполнению стека и задать эти конкретные вопросы. – Pete

+0

Я согласился с Питом. –

ответ

0

Все, что вам нужно сделать, чтобы установить sql server isolation level. Чтобы устранить загрязнение считывания, оно должно быть в Read Committed или выше, (Не в Прочитано 0, не указан). Read Committed является установкой по умолчанию из коробки.

Возможно, стоит рассмотреть приведенную выше ссылку и посмотреть, какие преимущества (и последствия) обеспечивают более высокие настройки.

+0

избили меня! – Ric

0

Вы можете установить уровень изоляции транзакции SERIALIZABLE. используя следующее заявление

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; 

Перед BEGIN TRANSACTION но Предупреждение это может привести к замедлению другого пользователя, который будет пытаться увидеть на обновления или вставки данных в таблицы, Вы также можете использовать Выделение SNAP_SHOT Уровень, который показывает вам только последние данные Commited/Saved, но он широко использует Temp DB, который также может влиять на производительность.

2

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

Если читатель хочет выпустить грязные чтения , вы ничего не можете с этим поделать.

Обратите внимание, что изменение вашего уровня изоляции не оказывает никакого влияния на уровень изоляции читателя.

+0

Что касается вашего последнего предложения, я сожалею, что это неверно, если вы установили уровень изоляции READ_COMMITTED_SNAPSHOT в своей базе данных. После того, как вы установите его, все запросы начнут использовать данные с версией строки, затрагивающие всех читателей. – Jaime

+1

@Jaime: простой тест может показать обратное. Существует причина, называемая 'READ_COMMITTED_SNAPSHOT', а не' EVERY_READ_SNAPSHOT' ... –

+0

Кроме того, включение READ_COMMITTED_SNAPSHOT изменяет читателей. Ремус говорит, что нужно менять читателей, и это правда. – usr

3

Другие ответы предполагают, что вы уже используете транзакцию. Я не буду этого пропустить, так как вам может не хватать его.

Вы должны использовать транзакцию, чтобы гарантировать, что записи во всех 15 таблицах или ни одна из них не вставлена ​​/ не обновлена. Транзакция гарантирует вам атомарность в вашей работе. Если что-то не удается во время хранимой процедуры, и вы не используете транзакцию, некоторые операции сохранения и обновления будут выполняться, а некоторые - не те (из запроса, вызвавшего ошибку).

Если вы используете BEGIN TRAN и COMMIT для успешных операций или ROLLBACK в случае отказа, вы получите все или ничего. Вы должны проверить наличие ошибок после выполнения каждого запроса и вызвать ROLLBACK TRANSACTION, если он есть, или вызвать COMMIT в конце хранимой процедуры.

Существует хороший образец в the accepted answer of this Stackoverflow question о том, как обрабатывать транзакции внутри хранимой процедуры.

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

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

Существует много литературы по этой теме через Интернет. Если вас интересуют уровни изоляции моментальных снимков, я предлагаю вам прочитать это great article from Kendra Little at Brent Ozar.

+0

Downvoted, потому что вы ВСЕГДА используете транзакции. Невозможно выполнить оператор в SQL Server (или любой базе данных), который НЕ является транзакцией. Операция «Begin Transaction» позволяет размещать MULTIPLE-операторы в одной транзакции. –

+0

Уважаемый @CharlesBretana, Конечно, и я говорю, что он должен обернуть все свои 15 запросов внутри хранимой процедуры в транзакции. Он действительно работает с несколькими утверждениями, так как он обновляет 15 таблиц внутри хранимой процедуры. – Jaime

+0

@ Джейми, да, я вижу, что теперь, вы правы, мои извинения, я удалю свой нисходящий ... –

Смежные вопросы