Опубликован: 11.12.2006 | Доступ: свободный | Студентов: 5820 / 381 | Оценка: 4.42 / 3.86 | Длительность: 57:15:00
Лекция 19:

Транзакции и блокировка транзакций

Аннотация: Транзакция – набор операторов, изменяющих данные. Использование транзакций позволяет обеспечить более высокий уровень надежности работы вашей системы. Четкое представление о четырех составляющих транзакции (атомарность, согласованность, изолированность, устойчивость) поможет не допустить ошибок. Блокировка и откаты транзакций являются немаловажными составляющими грамотно написанного сценария. Обширные теоретические знания совместно с практическими навыками дают хорошую базу для эффективного использования транзакций в повседневной работе.

В этой лекции рассматриваются основы использования транзакций и блокировки транзакций. Вы узнаете, что такое транзакция, какими свойствами в Microsoft SQL Server 2000 должны обладать транзакции, чтобы их можно было использовать, как использовать режимы транзакций для указания начала и конца транзакции и как фиксировать (завершать) транзакции и выполнять их "откат" (отмену). Мы рассмотрим типы и режимы блокировки, которые используются в SQL Server при выполнении транзакций, а также концепции блокирования и взаимоблокировки. Лекция заканчивается описанием некоторых подсказок блокировки на уровне таблиц, которые вы можете использовать в ваших транзакциях.

Что такое транзакция?

Транзакция – это набор операций, который выполняется как один логический блок. Использование транзакций позволяет SQL Server обеспечивать определенный уровень целостности и восстанавливаемости данных. Журнал транзакций, который должна иметь каждая база данных, поддерживает запись всех транзакций, которые осуществляют любой тип модификации в базе данных (вставка, обновление или удаление). SQL Server использует этот журнал транзакций для восстановления данных в случае ошибок или отказов системы.

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

ACID-свойства

Чтобы транзакцию можно было считать допустимой для использования, она должна отвечать четырем требованиям. Эти требования называют ACID-свойствами. "ACID" – это сокращение от "atomicity (атомарность), consistency (согласованность), isolation (изолированность) и durability (устойчивость)". В SQL Server включены механизмы, помогающие обеспечивать соответствие транзакций каждому из этих требований.

Атомарность

SQL Server обеспечивает, что в случае успешного выполнения транзакции фиксируются все модификации данных этой транзакции (в виде группы), а в случае неудачного выполнения транзакции не фиксируется ни одна из модификаций; иными словами, SQL Server обеспечивает атомарность своих транзакций. Транзакция должна выполняться как элементарная (атомарная) операция – отсюда термин "атомарность". Чтобы транзакция считалась успешно выполненной, должен быть выполнен каждый шаг (или оператор) этой транзакции. При неудачном выполнении одного из шагов вся транзакция считается неуспешной, и происходит отмена всех модификаций, внесенных с момента начала транзакции. SQL Server содержит механизм управления транзакциями, который автоматически определяет результат завершения транзакции (успешный или неуспешный) и при необходимости (в случае неуспешной транзакции) отменяет любые модификации данных.

Согласованность

SQL Server обеспечивает также согласованность ваших транзакций. Согласованность означает, что после окончания транзакции все данные остаются в согласованном состоянии (сохраняется целостность данных) – будь то успешно или неуспешно завершенная транзакция. Перед началом любой транзакции база данных должна быть в согласованном состоянии, а это означает поддержку целостности данных и правильность внутренних структур, таких как индексы B-деревьев и двунаправленные списки. После выполнения транзакции база данных тоже должна быть в согласованном состоянии – в новом состоянии для успешной транзакции или в том же состоянии, что и перед началом транзакции в случае неуспешного завершения.

Согласованность также является свойством в управлении транзакциями, которое поддерживается в SQL Server. Если ваши данные являются согласованными, а в ваших транзакциях поддерживается логическая согласованность и целостность данных, то SQL Server обеспечит согласованность данных после любой транзакции. Используя репликацию данных в распределенной среде, вы можете задавать различные уровни согласованности от конечной сходимости транзакций, т.е. скрытой согласованности, до непосредственной согласованности транзакций. Уровень согласованности будет зависеть от типа используемой вами репликации. Более подробную информацию о репликациях см. в лекциях "Репликация в Microsoft SQL Server: обзор типов репликации и репликация моментальных снимков" , "Репликация транзакций" и "Репликация слиянием" .

Изолированность

Изолированность означает, что каждая транзакция действует так же, как если бы она была единственной в системе; иными словами, модификации, выполняемые в одной транзакции, изолируются от модификаций, выполняемых в другой параллельно выполняемой транзакции. Тем самым на любую транзакцию не влияет никакое значение, изменяемое другой транзакцией, пока это изменение не будет зафиксировано. В случае неуспешной транзакции ее модификации не будут оказывать влияния, поскольку будет выполнен откат (отмена) соответствующих изменений. SQL Server позволяет вам задавать уровень изолированности для ваших транзакций. Характер изолируемости транзакций зависит от указанного вами уровня изолированности.

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

SQL Server поддерживает четыре уровня изолированности. Уровень изолированности – значение, определяющее уровень, при котором в транзакции допускаются несогласованные данные, т.е. степень изолированности одной транзакции от другой. Более высокий уровень изолированности повышает точность данных, но при этом может снижаться количество параллельно выполняемых транзакций. С другой стороны, более низкий уровень изолированности позволяет выполнять больше параллельных транзакций, но снижает точность данных. Указываемый вами уровень изолированности для сеанса SQL Server определяет блокирующее поведение всех операторов SELECT, выполняемых во время этого сеанса (если только вы не задали другой уровень изолированности). Блокирующее поведение описано в разделе "Блокировка транзакций" ниже в этой лекции. Ниже описано четыре уровня изолированности – от низшего до высшего:

  • Read uncommitted (Чтение незафиксированных данных). Самый низкий уровень изолированности. На этом уровне транзакции изолированы только в такой степени, чтобы нельзя было читать физически поврежденные данные.
  • Read committed (Чтение фиксированных данных). Принятый по умолчанию уровень для SQL Server. На этом уровне разрешается чтение только фиксированных данных. ( Фиксированные данные – это данные, которые стали постоянной частью базы данных.)
  • Repeatable read (Повторяемость чтения). Уровень, при котором чтение одной и той же строки или строк в транзакции дает одинаковый результат. (Пока транзакция не завершена, никакие другие транзакции не могут модифицировать эти данные.)
  • Serializable (Упорядочиваемость).Самый высокий уровень изолированности; транзакции полностью изолируются друг от друга. На этом уровне результаты параллельного выполнения транзакций для базы данных совпадают с последовательным выполнением тех же транзакций (по очереди в каком-либо порядке).