- •Практическая работа. Бизнес-транзакции и транзакции sql Server
- •Управление изоляцией транзакций
- •Мониторинг блокировок
- •Уровень изоляции транзакции
- •Используем только чтение зафиксированных данных
- •Применяем уровень изоляции read commited
- •Применяем уровень изоляции read commited snapshot
- •Как добиться согласованных повторяющихся операций чтения
- •Применяем уровень изоляции snapshot
- •Как предотвратить параллельные изменения данных
- •Применяем уровень изоляции repeatable read
- •Применяем уровень изоляции serializable
- •Борьба с блокированиями
- •Выполняем мониторинг блокирований при помощи динамических административных представлений
- •Борьба с взаимоблокировками
- •Разыгрываем простой сценарий взаимоблокировки
- •5. Закройте все окна запросов.
Уровень изоляции транзакции
Вы убедились в том, что SQL Server изолирует транзакцию при помощи различных типов блокировок в блокируемых ресурсах. Чтобы разрабатывать надежные транзакции, важно не только определить содержание транзакции и случаи, в которых должен быть выполнен ее откат, но также и то, какие блокировки следует удерживать в процессе транзакции, и какую продолжительность они должны иметь. Это определяется через механизм уровней изоляции. Благодаря различным уровням изоляции SQL Server дает разработчикам возможность определить для каждой отдельной транзакции строгость изоляции от другой транзакции. Уровни изоляции транзакций определяют:
будут ли блокировки использоваться при чтении данных;
как долго удерживаются блокировки;
какие типы блокировок используются для чтения данных;
что произойдет, если операции чтения потребуется считать данные, на которые распространяется монопольная блокировка другой транзакции. В этом случае SQL Server может:
подождать до снятия блокировки другой транзакцией;
прочитать незафиксированные данные;
прочитать последнюю зафиксированную версию данных.
Стандарт ANSI 99 определяет четыре уровня изоляции транзакций; все они поддерживаются в SQL Server.
READ UNCOMMITTED (чтение незафиксированных данных) не использует или не проверяет наличие блокировок при чтении данных.
Следовательно, на этом уровне изоляции возможно чтение незафиксированных данных.
READ COMMITTED (чтение зафиксированных данных) – читает только зафиксированные данные и ожидает снятия монопольной блокировки другой транзакцией. Разделяемые блокировки, используемые для чтения данных, снимаются сразу после завершения операции чтения. READ COMMITTED - уровень изоляции по умолчанию для SQL Server.
REPEATABLE READ (повторяющееся чтение) читает данные так же, как уровень READ COMMITTED, но удерживает разделяемую блокировку до окончания транзакции.
SERIALIZABLE (упорядочиваемое чтение) аналогично уровнюREPEAT ABLE READ. Этот уровень блокирует не только вовлеченные данные, но и весь диапазон данных. Это не допускает вставки новых данных в диапазон, используемый в запросе, что могло бы привести к фантомному чтению (см. тему «Эффекты параллелизма» в Электронной документации SQL Server 2005).
Кроме того, в SQL Server есть два дополнительных уровня изоляции, которые используют для чтения данных версии строк (об этих уровнях изоляции мы подробно поговорим далее в этой главе). Использование версий строк позволяет транзакции читать последнюю зафиксированную версию данных, если на эти данные распространяется монопольная блокировка. Это может способствовать существенному увеличению производительности запроса, поскольку операциям чтения не приходится ожидать снятия блокировок.
READ COMMITTED SNAPHOT (зафиксированное чтение, моментальный снимок) — это новая реализация уровня READ COMMITTED (зафиксированное чтение). В отличие от обычного уровня READCOMMITED, SQL Server читает последнюю версию зафиксированных данных, а, значит, при выполнении операций чтения ему не приходится ждать снятия блокировок. Этот уровень можно использовать вместо уровня READ COMMITED.
Уровень SNAPSHOT (моментальный снимок) использует для предоставления устойчивости транзакционного чтения управление версиями строк. Это означает, что в течение транзакции одни и те же данные всегда читаются с уровнем изоляции SERIALIZABLE, но при этом нет необходимости в блокировке данных для предотвращения изменения их другими транзакциями, поскольку благодаря управлению версиями строк обеспечивается согласованность чтения.
Независимо от того, какой уровень изоляции задан, изменения данных всегда блокируются монопольными блокировками, которые удерживаются до окончания транзакции.
Не всегда легко правильно выбрать уровень изоляции. По общему правилу, выбирать следует такой уровень изоляции, который блокирует наименьший объем данных на самый непродолжительный промежуток времени, поддерживая необходимый уровень безопасности транзакции. В следующем разделе мы рассмотрим некоторые сценарии, которые продемонстрируют работу уровней изоляции в деталях, а также выбор правильного уровня изоляции.
