Автор работы: Пользователь скрыл имя, 21 Ноября 2010 в 13:18, Не определен
Целью данной работы является рассмотрение технологии работы с транзакциями, а так же работу транзакций в Microsoft SQL Server 2000
Практические методы сериализации транзакций основываются на учете этих конфликтов.
Блокировки, называемые также синхронизационными захватами объектов, могут быть применены к разному типу объектов. Наибольшим объектом блокировки может быть вся БД, однако этот вид блокировки сделает БД недоступной для всех приложений, которые работают с данной БД. Следующий тип объекта блокировки — это таблицы. Транзакция, которая работает с таблицей, блокирует ее на все время выполнения транзакции. Именно такой вид блокировки рассмотрен в таблице 1. Этот вид блокировки предпочтительнее предыдущего, потому что позволяет параллельно выполнять транзакции, которые работают с другими таблицами.
В ряде СУБД реализована блокировка на уровне страниц. В этом случае СУБД блокирует только отдельные страницы на диске, когда транзакция обращается к ним. Этот вид блокировки еще более мягок и позволяет разным транзакциям работать даже с одной и той же таблицей, если они обращаются к разным страницам данных.
Для повышения параллельности выполнения транзакций используется комбинирование разных типов синхронизационных захватов.
Рассматривают два типа блокировок (синхронизационных захватов):
Захваты объектов несколькими транзакциями по чтению совместимы, то есть нескольким транзакциям допускается читать один и тот же объект, захват объекта одной транзакцией по чтению не совместим с захватом другой транзакцией того же объекта по записи, и захваты одного объекта разными транзакциями по записи не совместимы. Правила совместимости захватов одного объекта разными транзакциями изображены в таблице 1.1.
Таблица 1.1 - Правила применения жесткой и нежесткой блокировок транзакций
Таблица 1.2 Перечень действий множества транзакций
Время | Транзакция | Действие |
0 | T1 | Select A |
1 | T2 | Select B |
2 | T1 | Select C |
3 | T4 | Select D |
4 | T5 | Select A |
5 | T2 | Select E |
6 | T2 | Update E |
7 | T3 | Select F |
8 | T2 | Select F |
9 | T5 | Update A |
10 | T1 | Commit |
11 | T6 | Select A |
12 | T5 | Commit |
13 | T6 | Select C |
14 | T6 | Update C |
15 | T7 | Select G |
16 | T8 | Select H |
17 | T9 | Select G |
18 | T9 | Update G |
19 | T8 | Select E |
20 | T7 | Commit |
21 | T9 | Select H |
22 | T3 | Select G |
23 | T10 | Select A |
24 | T9 | Update H |
25 | T6 | Commit |
26 | T11 | Select C |
27 | T12 | Select D |
28 | T12 | Select C |
29 | T2 | Update F |
30 | T11 | Update C |
31 | T12 | Select A |
32 | T10 | Update A |
33 | T12 | Update D |
34 | T2 | Select G |
35 | - | - |
В примере, представленном в таблице 1 считается, что первой блокирует объект транзакция А, а потом пытается получить к нему доступ транзакция В.
На рисунке 1.5 приведен ранее рассмотренный пример с выполнением транзакций 1 и 2, но с учетом разных типов блокировки. На рисунке видно, что, применив нежесткую блокировку к таблице 2 со стороны транзакции 1, мы обеспечили существенное уменьшение времени выполнения транзакции 2. Теперь транзакция 2 не ждет окончания транзакции 1, и поэтому завершает свою работу, намного раньше.
Рисунок
1.5 - Использование жесткой и нежесткой
блокировки
К сожалению, применения разных типов блокировок приводит к проблеме тупиков. Проблема тупиков возникла при рассмотрении выполнения параллельных процессов в операционных средах и также была связана с управлением разделяемыми (совместно используемыми) ресурсами.
Пример. Пусть транзакция А сначала жестко блокирует таблицу 1, а потом жестко блокирует таблицу 2. Транзакция B, наоборот, сначала жестко блокирует таблицу 2, а потом жестко блокирует таблицу 1. Если обе эти транзакции начали работу одновременно, то после выполнения операций модификации первыми объектами каждой транзакции они обе окажутся в бесконечном ожидании: транзакция А будет ждать завершения работы транзакции B и разблокировки таблицы 2, а транзакция В также безрезультатно будет ждать окончания работы транзакции А и разблокировки таблицы 1. (Рисунок 1.6). [17]
Рисунок 1.6 Взаимная блокировка транзакций
Основой обнаружения тупиковых ситуаций является построение (или постоянное поддержание) графа ожидания транзакций. Граф ожидания транзакций может строиться двумя способами. Если транзакция А ждет окончания транзакции В, то из вершины А в вершину В идет стрелка. Дополнительно стрелки могут быть помечены именами заблокированных объектов и типом блокировки. Пример такого графа ожиданий приведен на рисунке 1.7.
Рисунок 1.7 Пример графа ожиданий транзакций
Граф ожиданий построен для транзакций Т1, Т2,___,Т12, которые работают с объектами БД A,В,...,Н.
Перечень действий, которые совершают транзакции над объектами, приведен в таблице 1.1.
На графе объекты блокировки помечены типами блокировок, S — нежесткая (разделяемая) блокировка, X — жесткая (эксклюзивная) блокировка.
На диаграмме состояний ожидания видно, что транзакции Т9, Т8, Т2 и Т3 образуют цикл. Именно наличие цикла и является признаком возникновения тупиковой ситуации. Поэтому в момент 3 перечисленные транзакции будут заблокированы.
Критерием выбора является стоимость транзакции; жертвой выбирается самая дешевая транзакция. Стоимость транзакции определяется на основе многофакторной оценки, в которую с разными весами входят время выполнения, число накопленных захватов, приоритет. После выбора транзакции-жертвы выполняется откат этой транзакции, который может носить полный или частичный характер. При этом, естественно, освобождаются захваты и может быть продолжено выполнение других транзакций.
Для распознавания тупика здесь, так же как и в первом методе, производится построение графа ожидания транзакций и в этом графе ищутся циклы. Традиционной техникой (для которой существует множество разновидностей) нахождения циклов в ориентированном графе является редукция графа.
Не вдаваясь в детали, редукция состоит в том, что, прежде всего из графа ожидания удаляются все дуги, исходящие из вершин-транзакций, в которые не входят дуги из вершин-объектов. (Это как бы соответствует той ситуации, что транзакции, не ожидающие удовлетворения захватов, успешно завершились и освободили захваты.) Для тех вершин-объектов, для которых не осталось входящих дуг, но существуют исходящие, ориентация исходящих дуг изменяется на противоположную (это моделирует удовлетворение захватов). После этого снова срабатывает первый шаг, и так до тех пор, пока на первом шаге не прекратится удаление дуг. Если в графе остались дуги, то они обязательно образуют цикл. [2]
Естественно, такое насильственное устранение тупиковых ситуаций является нарушением принципа изолированности пользователей.
В централизованных системах стоимость построения графа ожидания сравнительно невелика, но она становится слишком большой в по-настоящему распределенных СУБД, в которых транзакции могут выполняться в разных узлах сети. Поэтому в таких системах обычно используются другие методы сериализации транзакций.
Для
обеспечения сериализации транзакций
синхронизационные захваты
Достаточно легко
убедиться, что при соблюдении двухфазного
протокола синхронизационных
Всего
введено 4 уровня изолированности пользователей.
Самый высокий уровень
Следующий
уровень изолированности
Третий уровень изолированности связан с подтвержденным чтением, он называется READ COMMITED. На этом уровне изолированности транзакция не имеет доступа к промежуточным результатам других транзакций, поэтому проблемы пропавших обновлений и промежуточных данных возникнуть не могут. Однако окончательные данные, полученные в ходе выполнения других транзакций, могут быть доступны нашей транзакции. При этом уровне изолированности транзакция не может обновлять строку, уже обновленную другой транзакцией. При попытке выполнить подобное обновление транзакция будет отменена автоматически, во избежание возникновения проблемы пропавшего обновления.