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

В этой статье представлен мой прогресс в изучении функций параллелизма в SQL Server.

В этой статье мы обсудим транзакции и уровни изоляции / режимы чтения.

По умолчанию, когда вы пишете SQL, он запускается в транзакции автоматической фиксации, что означает, что каждый оператор будет зафиксирован в базе данных после его выполнения.

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

Сделки здесь, чтобы помочь.

Согласно Документации по SQL Server

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

Транзакция выглядит следующим образом:

Здесь мы хотим вставить в таблицу Resumes, а также обновить таблицу ResumeCounts за одну транзакцию. Если второй оператор дал ошибку, мы бы хотели откатить транзакцию и удалить Мэтта Эланда из таблицы Resumes. Эта транзакция позаботится об этом за нас.

Кроме того, вы можете использовать оператор ROLLBACK TRANSACTION, если просто хотите увидеть, выполняется ли оператор, и получить представление о том, сколько строк обновлено. Я часто рекомендую запускать операторы в ROLLBACK TRANSACTION для проверки ошибок и в качестве проверки работоспособности перед изменением транзакции на COMMIT TRANSACTION.

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

Прочитано совершено

По умолчанию SQL Server будет работать в этом режиме и считывать только зафиксированные данные (не грязные - в настоящее время изменяемые другим запросом). Это предотвращает так называемое грязное чтение.

Чтобы активировать этот режим, выполните следующую инструкцию:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

Читать незафиксированные

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

Чтобы активировать этот режим, выполните следующую инструкцию:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

Повторяющееся чтение

Repeatable Read добавляет Read Uncommitted дополнительный уровень безопасности. В дополнение к чтению вещей, которые еще не были зафиксированы, Repeatable Read получает общую блокировку для рассматриваемых строк, чтобы предотвратить их дальнейшее обновление до завершения транзакции. Это означает, что любые последующие чтения этих строк во время транзакции дадут тот же результат. Это не обязательно верно для Read Uncommitted.

Обычно дополнительные накладные расходы на разделяемые блокировки делают Repeatable Read менее желательным, но могут быть случаи, когда их полезно использовать.

Чтобы активировать этот режим, выполните следующую инструкцию:

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

Сериализуемый

Serializable - это крайняя мера, требующая полного контроля над диапазоном изменяемых строк. Он не будет читать незафиксированные и не позволит другим транзакциям читать данные, которые он изменяет. Таким образом, он требует исключительных блокировок, заставляя другие транзакции ждать его завершения. Это также предотвращает добавление других строк в набор записей, предотвращая так называемое фантомное чтение.

Это имеет последствия для высокой целостности данных и безопасности за счет производительности.

Чтобы активировать этот режим, выполните следующую инструкцию:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

Снимок

Снимок - это особый параметр SQL Server, который эффективно делает снимок строк, оцениваемых в начале транзакции.

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

Чтобы активировать этот режим, выполните следующую инструкцию:

SET TRANSACTION ISOLATION LEVEL SNAPSHOT

Транзакции - хороший инструмент для управления целостностью данных во время обновления и вставки скриптов, которые сильно касаются нескольких таблиц.

Далее в этой серии мы обсудим блокировку.

Первоначально опубликовано на https://dev.to 7 сентября 2019 г.