Понятие транзакций и блокировок

 

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

При выполнении транзакций СУБД должна придерживаться определенных правил обработки набора команд, входящих в транзакцию. Рассмотрим эти правила:

· Атомарность. Это требование говорит о том, что выполняемые в транзакции изменения будут либо выполнены все, либо не будут выполнены вовсе.

· Согласованность (или постоянство). Все данные после выполнения транзакции должны находится в согласованном состоянии, то есть все правила и ограничения целостности должны быть соблюдены.

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

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

 

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

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

Блокировкой называют временно накладываемое ограничение на выполнение некоторых операций обработки данных. В SQL Server 2000 имеется множество видов блокировок. Управление блокировками занимается менеджер блокировок. Транзакции и блокировки тесно связаны друг с другом.

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

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

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

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

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

 

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

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

· Уровень 1 – запрещение «грязного» чтения. Если транзакция начала изменять данные, то никакая другая транзакция не может прочитать эти данные до тех пор, пока первая транзакция не завершится.

· Уровень 2 – запрещение неповторяемого чтения. Если транзакция считывает данные, то никакая другая транзакция не может их изменить. Следовательно, при повторном чтении данных они будут находиться в первоначальном состоянии.

· Уровень 3 – запрещение фантомов. Если транзакция обращается к данным, то никакая другая транзакция не сможет добавить новые или удалить имеющиеся строки.