reforef.ru 1 2 ... 9 10

Лекция 13 Транзакции и параллельная обработка данных


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

Список ключевых терминов. Смесь транзакций. График запуска набора транзакций. Последовательный график запуска транзакций. Чередующийся график запуска транзакций. Сериализуемый график запуска транзакций. Проблемы параллельного выполнения транзакций. Проблема потери результатов обновления. Проблем чтений «грязных» данных. Проблема несовместимого анализа (неповторяемое считывание, фиктивные элементы (фантомы), собственно несовместимый анализ). Конкурирующие транзакции. Конфликты доступа. Блокировка данных. Монопольная блокировка (X- блокировка). Разделяемая блокировка (S- блокировка). Граф ожидания транзакций. Изолированность транзакций. Журнал транзакций.

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

Текст лекции
В данной лекции изучаются возможности параллельного выполнения транзакций несколькими пользователями или приложениями, т.е. свойство изолированности транзакций.

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


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

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

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

13.1 Работа транзакций в смеси
В предыдущей лекции1 отмечалось, что транзакция рассматривается как последовательность элементарных атомарных операций. Атомарность отдельной элементарной операции в транзакции состоит в том, что СУБД гарантирует, что, с точки зрения пользователя, будут выполнены условия:

  1. атомарность элементарной операции – элементарная операция будет выполнена целиком или не выполнена вовсе;


  2. строгая очередность элементарных операций – во время выполнения элементарной операции не выполняются никакие другие операции других транзакций.

Например, элементарными операциями транзакции будут считывание страницы данных с диска или запись страницы данных на диск. Страница данных – это минимальная единица для дисковых операций СУБД. Условие 2 на самом деле является именно логическим условием, т.к. реально система может выполнять несколько различных элементарных операций в один и тот же момент. Например, данные могут храниться на нескольких физически различных дисках и операции чтения-записи на эти диски могут выполняться одновременно.

Элементарные операции различных транзакций могут выполняться в произвольной очередности. При этом, внутри каждой транзакции последовательность элементарных операций этой транзакции является строго определенной. Например, если есть несколько транзакций T, Q, S, состоящих из последовательности операций элементарных:

T = {T1, T2, T3, …, Tn},

Q = {Q1, Q2, Q3, …, Qm},

S = {S1, S2, S3, …, Sl},

то реальная последовательность, в которой СУБД выполняет эти транзакции, может быть, например, такой {T1, Q1, T2, S1, T3, S2, S3, Q2,…}.

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

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

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

13.2. Проблемы параллельной работы транзакций
Каким образом транзакции различных пользователей могут мешать друг другу? Различают три основные проблемы параллелизма:


  1. Проблема потери результатов обновления.

  2. Проблема незафиксированной зависимости (чтение «грязных» данных, неаккуратное считывание).

  3. Проблема несовместимого анализа.

Рассмотрим подробно эти проблемы на примере двух транзакций, A и B, запускающиеся в соответствии с некоторыми графиками. Пусть транзакции работают с некоторыми объектами базы данных, например со строками таблицы. Операцию чтение строки P будем обозначать P=P0, где P0 – прочитанное значение. Операцию записи значения P1 в строку P будем обозначать P1P.

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

Таблица 13.1 – Последовательность операций чтения и записи данных


Транзакция A

Время

Транзакция B

Чтение P=P0

t1

---

---

t2

Чтение P=P0

Запись P1P

t3

---

---

t4

Запись P2P

Фиксация транзакции

t5

---

---

t6

Фиксация транзакции

Потеря результата обновления







После окончания обеих транзакций, строка P содержит значение P2, занесенное более поздней транзакцией B. Транзакция A ничего не знает о существовании транзакции B, и естественно ожидает, что в строке P содержится значение P1. Таким образом, транзакция A потеряла результаты своей работы.


Проблема незафиксированной зависимости (чтение «грязных» данных, неаккуратное считывание). Транзакция B изменяет данные в строке. После этого транзакция A читает измененные данные и работает с ними. Транзакция B откатывается и восстанавливает старые данные. Последовательность операций чтения и записи данных, выполняемых транзакциями A и B в этом случае, приведена в таблице 13.2.
Таблица 13.2 – Последовательность операций чтения и записи данных


Транзакция A

Время

Транзакция B

---

t1

Чтение P=P0

---

t2

Запись P1P

Чтение P=P0

t3

---

Работа с прочитанными данными P1

t4

---

---

t5

Откат транзакции P0P

Фиксация транзакции


t6

---

Работа с «грязными» данными








С чем же работала транзакция A? Транзакция A в своей работе использовала данные, которых нет в базе данных. Более того, транзакция A использовала данные, которых нет, и не было в базе данных! Действительно, после отката транзакции B, должна восстановиться ситуация, как если бы транзакция B вообще никогда не выполнялась. Таким образом, результаты работы транзакции A некорректны, т.к. она работала с данными, отсутствовавшими в базе данных.

Проблема несовместимого анализа. Проблема несовместимого анализа включает несколько различных вариантов:

  • Неповторяемое считывание;

  • Фиктивные элементы (фантомы);

  • Собственно несовместимый анализ.

Неповторяемое считывание. Транзакция A дважды читает одну и ту же строку. Между этими чтениями вклинивается транзакция B, которая изменяет значения в строке. Последовательность операций чтения и записи данных, выполняемых транзакциями A и B в этом случае, приведена в таблице 13.3.
Таблица 13.3 – Последовательность операций чтения и записи данных

Транзакция A

Время

Транзакция B

Чтение P=P0

t1


---

---

t2

Чтение P=P0

---

t3

Запись P1P

---

t4

Фиксация транзакции

Повторное чтение P=P1

t5

---

Фиксация транзакции

t6

---

Неповторяемое считывание








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



следующая страница >>