У меня есть требование сохранить/обновить данные в 15 таблицах. Я должен убедиться, что во время обновления необходимо поддерживать параллелизм и блокировку, чтобы не происходило никакого грязного чтения. Я обновляю данные с помощью хранимой процедуры. Что я могу сделать в oredr для реализации блокировки и параллелизма?Параллельность, блокировка в базе данных SQL Server
ответ
Все, что вам нужно сделать, чтобы установить sql server isolation level. Чтобы устранить загрязнение считывания, оно должно быть в Read Committed или выше, (Не в Прочитано 0, не указан). Read Committed является установкой по умолчанию из коробки.
Возможно, стоит рассмотреть приведенную выше ссылку и посмотреть, какие преимущества (и последствия) обеспечивают более высокие настройки.
избили меня! – Ric
Вы можете установить уровень изоляции транзакции SERIALIZABLE. используя следующее заявление
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
Перед BEGIN TRANSACTION но Предупреждение это может привести к замедлению другого пользователя, который будет пытаться увидеть на обновления или вставки данных в таблицы, Вы также можете использовать Выделение SNAP_SHOT Уровень, который показывает вам только последние данные Commited/Saved, но он широко использует Temp DB, который также может влиять на производительность.
Вы не можете предотвратить, чтобы это грязное чтение не произошло. Является ли читателем, который грязный читает, а не вы (писатель). Все, что вы можете сделать, это убедиться, что ваша запись атома, и это достигается путем переноса всех записей в одной транзакции. Таким образом, читатели, которые не выдают грязные чтения, будут видеть либо все ваши обновления, либо ни один (атомный).
Если читатель хочет выпустить грязные чтения , вы ничего не можете с этим поделать.
Обратите внимание, что изменение вашего уровня изоляции не оказывает никакого влияния на уровень изоляции читателя.
Что касается вашего последнего предложения, я сожалею, что это неверно, если вы установили уровень изоляции READ_COMMITTED_SNAPSHOT в своей базе данных. После того, как вы установите его, все запросы начнут использовать данные с версией строки, затрагивающие всех читателей. – Jaime
@Jaime: простой тест может показать обратное. Существует причина, называемая 'READ_COMMITTED_SNAPSHOT', а не' EVERY_READ_SNAPSHOT' ... –
Кроме того, включение READ_COMMITTED_SNAPSHOT изменяет читателей. Ремус говорит, что нужно менять читателей, и это правда. – usr
Другие ответы предполагают, что вы уже используете транзакцию. Я не буду этого пропустить, так как вам может не хватать его.
Вы должны использовать транзакцию, чтобы гарантировать, что записи во всех 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.
Downvoted, потому что вы ВСЕГДА используете транзакции. Невозможно выполнить оператор в SQL Server (или любой базе данных), который НЕ является транзакцией. Операция «Begin Transaction» позволяет размещать MULTIPLE-операторы в одной транзакции. –
Уважаемый @CharlesBretana, Конечно, и я говорю, что он должен обернуть все свои 15 запросов внутри хранимой процедуры в транзакции. Он действительно работает с несколькими утверждениями, так как он обновляет 15 таблиц внутри хранимой процедуры. – Jaime
@ Джейми, да, я вижу, что теперь, вы правы, мои извинения, я удалю свой нисходящий ... –
- 1. Блокировка SQL Server
- 2. Блокировка SQL Server Проблема
- 3. tempdb Блокировка SQL Server
- 4. Блокировка таблицы SQL Server
- 5. sql server - блокировка существующих записей в транзакции
- 6. Блокировка SQL Server на SELECT
- 7. Уровни изоляции транзакций - блокировка таблиц в базе данных Azure SQL
- 8. Блокировка уровня базы данных в Microsoft SQL Server: миграции схем
- 9. SQL Server - блокировка [SELECT] [UPDATE]?
- 10. Параллельность с чтением, но блокировка с мутированием
- 11. Вычислить столбец в базе данных SQL Server
- 12. Параметр установки в базе данных SQL Server
- 13. Параметр SQL Server AutoShrink в базе данных
- 14. Триггер в базе данных SQL Server
- 15. Создать пользователя в базе данных SQL Server
- 16. Капля роли в базе данных SQL Server?
- 17. Хранение изображений в базе данных SQL Server
- 18. 'ssf.dse' Таблицы в базе данных SQL Server
- 19. Ошибка в базе данных сервера SQL Server
- 20. Сохранить документ в базе данных SQL Server
- 21. Просмотр изменений в базе данных SQL Server
- 22. перечисления в базе данных SQL Server
- 23. Удалить пользователя в базе данных SQL Server
- 24. Уменьшение пространстваUsedMB в базе данных SQL Server
- 25. Кодировать данные в базе данных SQL Server
- 26. Обрезка значений в базе данных SQL Server
- 27. Связанные таблицы в базе данных SQL Server
- 28. пейджинг в базе данных SQL Server
- 29. Удаление индексов в базе данных SQL Server
- 30. Обновление записей в базе данных SQL Server
Я думаю, что первым шагом было бы сделать поиск Google на нем и прочитать об этом. Затем, когда у вас есть конкретные вопросы о его реализации, вы должны вернуться к переполнению стека и задать эти конкретные вопросы. – Pete
Я согласился с Питом. –