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

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

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

- в ходе выполнения транзакции пользователь видит только согласованные данные, пользователь не должен видеть несогласованных промежуточных данных;

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

Такая процедура называется сериализацией транзакций. Наиболее распространенным механизмом, который используется СУБД для реализации на практике сериализации транзакций, является механизм блокировок.

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

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

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

Рисунок 1 Блокировки при одновременном выполнении двух транзакций

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

Рисунок 2 Взаимная блокировка транзакций

Ход работы

1 Организовать следующие типы конфликтов между двумя параллельными транзакциями:

- W-W — транзакция 2 пытается изменять объект, измененный незакончившейся транзакцией 1;

- R-W — транзакция 2 пытается изменять объект, прочитанный незакончившейся транзакцией 1;

- W-R — транзакция 2 пытается читать объект, измененный незакончившейся транзакцией 1.

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

3 Дополнительно стрелки пометить именами заблокированных объектов и типом блокировки. Типы блокировок, S — нежесткая (разделяемая) блокировка, X — жесткая (эксклюзивная) блокировка.

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

5 Выбрать способ разрешения исключительной ситуации. Разрушение тупика начинается с выбора в цикле транзакций так называемой транзакции-жертвы, то есть транзакции, которой решено пожертвовать, чтобы обеспечить возможность продолжения работы других транзакций. Критерием выбора является стоимость транзакции; жертвой выбирается самая дешевая транзакция. Стоимость транзакции определяется на основе многофакторной оценки, в которую с разными весами входят время выполнения, число накопленных захватов, приоритет.

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

7 Оформить подробный отчет и сделать вывод по выполненной работе.

Контрольные вопросы

1 Что представляет собой взаимоблокировка?

2 Обнаружение SQL Server взаимоблокировок.

3 Разрешение тупиковой ситуации.

4 Как выбирается жертва взаимоблокировки?

5 Способы предотвращения взаимоблокировок.

6 Пояснить взаимосвязь транзакций и взаимоблокировок.

7 Виды (режимы) блокировок и их применение.

8 Проблемы, предотвращаемые блокировками.

9 Задание определенного типа блокировки – параметры оптимизации.

10 Уровни изоляции транзакции.

 



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: