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

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

2.4. Установка уровня блокирования и изолированности для отдельных команд SQL

При открытии нового соединения для всех транзакций устанавливается умалчиваемый уровень изолированности readcommitted. При необходимости можно задать другой уровень. Кроме того, в SQL Server 2005 существует возможность управлять изолированностью и способом блокирования на уровне команд insert, update, delete, select. Для этого применяются специальные ключевые слова, называемые хинтами. Каждый хинт соответствует уровню изолированности или типу блокировки, которую требуется наложить на данные, обрабатываемые данным SQL-оператором. Хинты включаются в вызов SQL-оператора, ставятся после ключевого слова with и заключаются в круглые скобки.

Рассмотрим следующий пример. Из БД пассажирских перевозок требуется получить сведения обо всех фирменных поездах. Во время выборки требуется наложить блокировку на считываемые строки, чтобы ни одна другая транзакция не могла модифицировать их во время выполнения команды. Для этого в операторе select указывается хинт rowlock. Полностью SQL-вызов выглядит следующим образом:

select * from trains with (rowlock)

where train_type = ‘фирменный’

Аналогичным образом хинты используются в командах insert, update, delete.

Описание хинтов SQL Server 2005

1. rowlock

Устанавливает блокировку на уровне строк, с которыми работает команда.

2. paglock

Блокирует страницу, к которой осуществлялось обращение.

3. tablock

Блокирует таблицу целиком и удерживает блокировку до конца выполнения команды. В то же время, если хинт tablock используется совместно с holdlock (см. ниже), блокировка сохраняется до завершения транзакции. Если tablock используется в команде select, другим транзакциям разрешается читать блокированные данные.

4. tablockx

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

5. holdlock

В большинстве случаев используется совместно с хинтами rowlock, paglock и tablock, сохраняя блокировку строк, страниц или таблиц до завершения транзакции.

6. updlock

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

7. nolock

Устанавливает для данной команды уровень изолированности readuncommitted. Хинт nolock разрешается использовать только в команде выборки.

8. readuncommitted

Аналогичен nolock.

9. readcommitted

Устанавливает для команды уровень изолированности readcommitted.

10. repeatableread

Устанавливает для команды уровень изолированности repeatableread.

11. serializable

Устанавливает для команды уровень изолированности serializable.

12. readpast

При выборке данных с этим хинтом СУБД будет пропускать строки, блокированные другими транзакциями, не ожидая разблокирования ресурсов. Хинт readpast можно использовать только в команде select. При этом в текущем соединении должен быть установлен уровень изолированности readcommitted.

3. Программа работы

1. Изучение SQL-операторов управления транзакциями.

2. Изучение уровней изолированности транзакций и способов блокирования.

4. Порядок выполнения работы

1. Изучить основные сведения из теории.

2. Изучить SQL-операторы обработки транзакций.