Изучение средств обеспечения целостности данных в SQL Server 2005. Транзакции и блокировки (Лабораторная работа № 5), страница 2

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

3. Запись после чтения.

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

Зарубежные специалисты выделяют два частных случая данного конфликта. Один из них носит название проблемы неповторяемого чтения. Эта ситуация связана с многократным чтением данных одной и той же транзакцией. Между двумя считываниями другая транзакция может выполнить модификацию, и после повторного чтения первая транзакция получит измененные данные. Второй случай – «чтение фантомов» – имеет  место, когда транзакция несколько раз производит выборку строк, удовлетворяющих одному и тому же логическому условию. Если между считываниями другая транзакция вставит строки, удовлетворяющие этому же условию, первая транзакция при последующем считывании получит неверный набор данных.

Механизм блокирования позволяет избежать перечисленных проблем. В основу принципов блокирования данных в СУБД Microsoft SQL Server положена концепция Американского национального института стандартов (ANSI), в которой выделено четыре  уровня блокирования.

1. Уровень 0 – Запрещение «загрязнения» данных.

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

2. Уровень 1 – Запрещение «грязного» чтения.

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

3. Уровень 2 – Запрещение неповторяемого чтения.

Если транзакция считывает данные, СУБД блокирует их так, что другие транзакции не могут изменять их до разблокирования.

4. Уровень 3 – Запрещение фантомов.

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

СУБД SQL Server 2005 поддерживает все перечисленные уровни блокирования. Наложением и снятием блокировок управляет специальная подсистема в составе SQL Server – менеджер блокировок (Lock Manager). Процесс управления блокировками в значительной степени автоматизирован: менеджер блокировок сам выбирает нужный уровень блокирования, стараясь применять как можно менее жесткий режим. Блокировки могут накладываться на строку таблицы или на таблицу целиком, на страницу и экстент.

Пользователь при помощи команд Transact-SQL может оказывать влияние на установку того или иного режима блокирования, используя следующие возможности:

·  задание уровня изолированности транзакции;

·  управление блокировками на уровне команд.

2.3. Уровни изолированности транзакций

Изолированность, как уже отмечалось выше, является одним из требований ACID. В SQL Server 2005 любой транзакции можно задать один из четырех возможных уровней изолированности. Для этого служит команда set transaction isolation level, имеющая следующий синтаксис:

set transaction isolation level

            {read committed | read uncommitted | repeatable read | serializable}