Программирование >>  Реляционные базы данных 

1 ... 100 101 102 [ 103 ] 104 105 106 ... 125


7.2 Транзакции в SQL

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

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

7.2.1 Преобразование

в последовательную форму

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

страны, наибольшее число кораблей которой было повреждено сражении.

с) Запросите у пользователя имя класса и другую информацию, необхоли мую для кортежа таблицы Classes, а также список назв;ший кораблей этою класса и даты их спуска на воду. При ЭТОМ пользователь не обязан сообщать первое слово названия корабля, являющееся именем класса !d) Проверьте, есть ли п отношениях Battles, Outcomes и Stiips корабли, участвовавшие в сражении до спуска их на воду, При наличии ошибки предложите пользователю режим излгенения даты спуска на воду или даты сражения. Выполните любое из запрошенных изменений.

*1 Упражнениа 7.1.3. В отношении

PC(model, speed, ram, tid, cd. price)

нужно найти все П К, для которых есть по крайней ме1е два более дорогих компьютера с такой же скоростью. Сущестиует множество способов решения этой згшачи, но вы должны применить переметаемый курсор. Прочтите кортежи, упорядоченные сначала по speed, а затем по price. Подсказка. После прочтения каждого кортежа пропускайте два кортежа, чгобы проверить, не изменяется ли значение speed.

!! !1прожнение 7.1.4. В разделе 7.1,1 было сказано, что в SQL невозможно написать факториальную программу. Это верно для SQL2, но рекурсия SQL3, описанная в разделе 5.10, позволяет сделать нечто подобное. Запишите запрос SQL3, применимый к отношению М, содержащему единственный кортеж (от), где т - натуральное число. Результатом запроса должно быть множество кортежей (я, я!), где I i я < т.



и нулно пыбрать какой-то искусегненный путь, чтобы пызпать такие ошибки при исполыопанип 10-\!мерч(;ской системы упраи-пеимя БД.

Пример 7.1 L Предположим. записы1ается функция chooseSeatQ для чтении отношения, содср.ччпшего репсы и свободные места, д.чи нахождения свободных MCCi II преврашения т н занятые. Отношение иазьрвается Flights и содержит атрибуты fltNum. fItDate. iltSeal и occupied, смысл которы.ч очевиден. Программа выбора мест кратко записана на рис. 7.S.

1) EXEC SQL BEGIN DECLARE SECTION;

2) (nt flight; / номер рейса V

3) ch3rdate[10]; Г дата рейса в формате SQL */

4) char sest(3]; г место представлено двумя цифрами и буквой /

5) int осе; г булева переменная, означающая, занято место

или нет*/ ..

6) EXEC SQL END DECLARE SECTION;

7) void chooseSestO {

8) /* программа С. предлагающая пользователю ввести рейс.

дату и место и размещающая эти данные в трех переменных с их именами */

9) EXEC SQL SELECT occupied INTO .occ

10) FROM Flights

11) WHERE fltNum = :flight AND fltDate= date AND fItSeat - ;seat;

121 if(!occ){

13) EXEC SQL UPDATE Flights

14) SET occupied =ВГ

15) WHERE fltNum =-flight AND fItDate = :dale AND fItSeat = .seat,

16) г операторы С и SQL для записи номера места

и сообщения пользователю этого номера */

17) else / операторы С для передачи пользователю сообщения

о недоступности места и просьбы выбрать другое место */

Рис. 7.S. Выбор меа

Строки (9) - (II) - это выбор единственной строки, устанавлнвагошмй разделяемую переменную осе в истинное или ложное значение (I илн 0) в зависимости or roio, с1юбодно или занято указанное место. Строка (12) проверяет, занятно ли место, и, если оно свободно, кортеж для этого места изменяется так. что место становится занятым. Это изменение выполняется на строках (13) -(И), а на ст1)оке (16) место приписывается заказавшему его пользователю. Практически информацию о местах люжно храштть в другом отношении. М наконеи. если место занято, строкл (17) сообщает об этом пользовател!о.

d>yHKUHR chooseSeatO .может выполняться одновременно несколькими пользователями. Для простоты предположим, что два агента пытаются забронировать одно ii то же место на один и тот же рейс и дат5 примерно в одно и то же время, как покатано на рмс. 7.9.



Время

Пользователь I обнаруживает, что место свободно

Пользователь 1 занимает мсио

Пользователь 2 обнаружнЕпет, что месго свободно

Пользователь 2 занимает место

Рие. 7.9. Два псльзовотелв одновременно пьггокжв зобронировоть одно и то же ллесго

Оба пользователя одновременно достигают строки (9), и их копии локальной переменной осе получают значение О, т.е. в данный момент место свободно. На строке (12) каждое выполнение chooseSeatQ заменяет данный бит на I. т.е. делает данное место занятым. Возможно, эти изменения выпапняются одно за другим и строка (16) сообщает каждому пользователю о том, что место принадлежит ему. О

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

Есчи два вызова chooseSeat() выполняются последовательно (приводимы в последовательную форму), ошибки не произойдет. Один из пользователей делает вызов первым, обнаруживает, что место свободно, и бронирует его. Затем следует вызов второго пользователи, который обнаруживает, что место занято. Это может обеспокоить пользователя, которому нужно место, но для БД важно только то, чтобы место приписывалось лишь один раз.

Обеспечение последовательности действий.

Зачастую практически невозможно требовать, чтобы операции выполнялись серийно: их слишком много, и поэтому требуется их параллельное вы-патнение. Таки\г образом, системы управления базами данных используют механизмы обеспечения серийности действий; даже если выполнение операций не яиляется серийным, результат выглядит лля пользователя так. словно они выполнялись серийно.

Как бьЕло показано в разделе 1.2.4. одним из обших методов обеспечения серийности для системы управления базой данных является блокировка элементов базы данных таким образом, чтобы две функции не могли получить к ним доступ одновременно Например, если функцию chooseSoet() из примера 7.11 написать для блокировки других операций вне таблицы Flights, то операиии, не имеющие дост)па к Flights, смоот выполняться параллельно с вызовом функции chooseSeatO, но не сможет выполняться никакой другой вызол ChooseSeatQ. Фактически, как было сказано и разделе I 2.4, блокировка более мелких чем таблицы элементов, например отдельного диска или кортежа обеспечивает еше более сильный пар.гплелизм, включая возможность одиопремснно выполнять различные вызовы функции chooseSeet().



1 ... 100 101 102 [ 103 ] 104 105 106 ... 125

3633-0053 Zoneco.
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика