Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
22700_62_OSBD_Prakticheskie.doc
Скачиваний:
25
Добавлен:
11.02.2015
Размер:
1 Мб
Скачать
☆

5.5. Вопросы и литература

1. Чем характеризуется реляционная модель данных.

2. Что определяет домен?

3. Поясните понятие отношения.

4. Что означает схема отношения.

5. На основе каких теоретико-множественных операций строится язык запросов к базе данных.

6. Какие разновидности операции соединения (JOIN) существуют.

7. С какой целью осуществляют декомпозицию базы данных.

8. Каким образом проявляется функциональная зависимость данных.

Учебник / Учебное пособие

Раздел

Страницы

1. Карпова Т.С. Базы данных: модели, разработка, реализация. - СПб.: Питер, 2001.- 304 с.; ил.

Главы 3,4

31-65

2. Хомоненко А.Д, Цыганков В.М., Мальцев М.Г. Базы данных: Учебник для высших учебных заведений / под ред. проф. Хомоненко А.Д., 6-ое изд. – М.:Бином-Пресс; СПб.:Корона-Век, 2007.-736с.

Гл.2, 3

29- 34, 49-107

6. Синхронизация процессов и доступа к ресурсам. Транзакции в ос и субд

6.1. Цель практического занятия

Целью практического занятия является более подробное ознакомление с понятием транзакций и организации их поддержки в СУБД.

6.2. План занятия

В рамках занятия рассматриваются следующие вопросы:

  • Журнализация операций над данными.

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

  • Откат и восстановление БД.

  • Синтаксис некоторых операторовSQL

6.3 . Используемые технологии

Для лучшего усвоения материала желательно проведение занятия с использованием компьютера.

6.4. Примеры для анализа

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

Восстановление может происходить на уровне:

базы данных, при этом база данных возвращается в предшествующее согласованное состояние и восстанавливается.

файла данных, при этом файл данных или набор файлов данных возвращается в исходное состояние и восстанавливается.

Полное восстановление базы данных может быть

  • простым восстановлением из полной резервной копии;

  • восстановлением на основе полной резервной копиибазы данных с ее последующимобновлением по журналу.

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

Журнал транзакций поддерживает следующие операции:

  • восстановление отдельных транзакций;

  • восстановление всех незавершенных транзакций при запуске;

  • повтор изменений в прямом направлении(«накат», redo) по журналу восстановленной базы данных до момента сбоя.

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

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

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

Логически журнал транзакций работает так, как если бы он являлся последовательностью записей в журнале. Каждая запись журнала идентифицируется регистрационным номером транзакции (номер LSN). Каждая новая запись добавляется в логический конец журнала с номером LSN, который больше номера LSN предыдущей записи.

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

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

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

В журнал транзакций записываются:

  • начало и конец каждой транзакции;

  • изменения данных (вставка, обновление или удаление), включая изменения в любой таблице (в том числе и в системных таблицах);

  • любое выделение и освобождение страниц и экстентов;

  • создание и удаление таблиц и индексов.

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

Журнал транзакций ведется с упреждением: Метод протоколирования транзакций, при котором записи в журнал всегда заносятся до записи данных

Синтаксис некоторых операторов для работы с транзакциями

Явные транзакции требуют, чтобы пользователь указал начало и конец транзакции:

1) BEGIN TRAN[SACTION] [имя_транзакции | @имя_переменной_транзакции] -начало транзакции.В журналетранзакцийрегистрируются первоначальные значения изменяемых данных и моментначала транзакции.

2) END TRAN[SACTION] - конец транзакции. Если в теле транзакции не было ошибок, то эта команда предписывает серверу зафиксировать все изменения, сделанные в транзакции, после чего в журнале транзакций помечается, что изменения зафиксированы и транзакция завершена.

3) COMMIT [TRAN[SACTION][имя_транзакции | @имя_переменной_транзакции]] -фиксация изменений.

4) SAVE TRAN[SACTION]{имя точки сохранения | имя переменной точки сохранения} -создание внутри транзакции точки сохранения. Сервер сохраняет состояние БД в текущей точке и присваивает сохраненному состоянию имя точки сохранения;

5) ROLLBACK [TRAN[SACTION] [имя_транзакции | @имя_переменной_транзакции

| имя точки сохранения | @имя переменной точки сохранения]] - прерывание транзакции. При приемесервером этой команды осуществляется откат транзакции, восстанавливается первоначальное состояние системы и в журнале транзакций отмечается, что транзакция была отменена. Отменяются все изменения, сделанные в БД после оператора BEGIN TRANSACTION, или отменяются изменения, сделанные в БД после точки сохранения, возвращая транзакцию к позиции выполнения оператора SAVE TRANSACTION.

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

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

SET TRANSACTION ISOLATION LEVEL

{ READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }

READ UNCOMMITED – чтение данных незавершенной транзакции, или допустимо "грязное"чтение. Изолирование соответствует уровню 0. Гарантируется только физическая целостность данных: если несколько пользователей одновременно изменяют одну и ту же строку, то в окончательном варианте строка будет иметь значение, определенное пользователем, последним изменившим запись. По сути, для транзакции не устанавливается никакой блокировки, которая гарантировала бы целостность данных.

READ COMMITTED– чтение данных завершённой, зафиксированной в журнале транзакции, при котором отсутствует "грязное" чтение. Но в процессе работы одной транзакции другая может быть успешно завершена и сделанные ею изменениязафиксированы. В итоге первая транзакция может работать с несогласованными данными (неповторяемое чтение).

REPEATABLE READ – повторяемое чтение. При повторном чтении строки обеспечиваются первоначально считанные данные, несмотря на какие-либо обновления, произведенные другими пользователями до завершения транзакции.

SERIALIZABLE – сериализуемая транзакция. Чтение запрещено до завершения транзакции.

В каждый момент времени возможен только одинуровень изолирования.

Блокировки курсоров

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

В соответствии со стандартом SQL при работе с курсорами можно выделить следующие основные действия:

• создание или объявление курсора;

• открытие курсора, т.е. наполнение его данными, которые сохраняются в многоуровневой памяти;

• выборка из курсора и изменение с его помощью строк данных;

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

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

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

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

Пример синтаксиса команды создания курсора в MS SQL:

<создание_курсора>::=

DECLAREимя_курсораCURSOR[LOCAL|GLOBAL]

[FORWARD_ONLY | SCROLL]

[STATIC | KEYSET | DYNAMIC | FAST_FORWARD]

[READ_ONLY | SCROLL_LOCKS | OPTIMISTIC]

[TYPE_WARNING]

FOR SELECT_оператор

[FOR UPDATE [OF имя_столбца[,...n]]]