Материал: Базы данных и их безопасность. Плотников Д.Г

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

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

Механизм транзакций

Все современные СУБД имеют средства для выполнения трех важнейших функций:

механизм поддержания транзакций;

службы управления параллельностью;

средства восстановления баз данных.

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

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

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

Любая транзакция всегда должна переводить БД из одного согласованного состояния в другое, хотя допускается, что согласованность состояния БД нарушается в ходе выполнения транзакции.

161

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

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

(или их эквиваленты).

Свойства транзакций

Существуют некоторые свойства, которыми должна обладать любая из транзакций:

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

Согласованность – каждая транзакция должна переводить БД из одного согласованного состояния в другое согласованное состояние.

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

162

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

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

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

Менеджер буферов отвечает за передачу данных между основной памятью компьютера и вторичной дисковой памятью.

6.2. Понятие управление параллельностью

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

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

163

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

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

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

Рассмотрим три примера потенциальных проблем, которые могут иметь мести при параллельном выполнении транзакций – проблему потерянного обновления, проблему зависимости от нефиксированных результатов и проблему несогласованной обработки.

Проблема потерянного обновления

Результаты вполне успешной завершенной операции обновления одной транзакции могут быть перекрыты результатами выполнения другой транзакции. Эта аномалия известна как проблема потерянного обновления (табл. 6.1).

Таблица 6.1

Пример проблемы потерянного времени

Время

Транзакция

Транзакция

Поле а1

Т1

Т2

 

 

t1

 

начало

100

t2

начало

чтение а1

100

t3

чтение а1

а1=а1+100

100

t4

а1=а1-10

запись а1

200

t5

запись а1

commit

90

t6

commit

 

90

164

Например, транзакция Т2 выполняется параллельно с транзакцией Т1.Транзакция Т1 заключается в снятии 10 тысяч рублей со счета, на котором исходно находится 100 тыс. руб., транзакция Т2 предполагает помещение 100 тыс. руб. на этот же счет. Если обе транзакции выполняются последовательно, то в результате должно оказаться 190 тыс. руб. на счете.

Пусть они выполняются параллельно и начинаются практически одновременно Т2 увеличивает сумму на 100 т.р. и записывает результат, равный 200 т.р. Тем временем Т1 уменьшает значение своей копии исходной суммы на 10 т.р. и записывает результат 90 т.р., перекрывая результат предыдущего обновления. Избежать потери результатов выполнения транзакции Т2 можно, запретив транзакции Т1 считывать исходное значение на счету вплоть до завершения выполнения транзакции Т2.

Проблема зависимости от нефиксированных результатов

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

165

Источник: https://studfile.net/preview/16563653/