Теория и практика построения баз данных (1088289), страница 107
Текст из файла (страница 107)
что одна строка была доступна до вставки. Отиеняек вставку и испопьзуеи существующую строку. *! ВЕ61М ЙОЕЕВАСК 5ЕЕЕСТ РМеышогй!О = Могк!0 !* Получаеи значение столбца Могй10 из существующей строки *) ГЙОН Узеый)бде1.обо.ЕМСЙК] ЫНЕЙЕ Агт!з110 - РА!О АИО т 1)е = Рт 1]е АМО Сору - РСору ЕМО 5ЕЕЕСТ РСоцп1 - Соцпс(*)!* Проверяеи наличие доступных строк в таблице ТЙАМ5 *l ГРОМ У!еийтбде1.боо.тЙАМ5 ЫНЕЙЕ РМЕышогй10 - ИогК10 АМО Сцз1оюег!0 15 ИОЕС 1Г Рсоцпт > 0 ЙЕТОЙМ !* Ииеется одна строка *т' 1М5ЕЙТ 1МТО Утеый!Оде1.сабо.тЙАМ5 (ЫогК!0.
ОасеАссц!геб) УАСОЕ5 (РМеыиогК10. ЯЕТОАТЕ()) Кроме того, галерее требуется, чтобы для каждого произведения, выставленного на продажу, имелась строка в таблице ТЙАМ5 с нулевым значением Сцзтощет10. Если данная работа никогда прежде не выставлялась в галерее, нужно создать новую запись в таблице ТЙАМ5 и связать ее с новой строкой таблицы ВОЙК. Если работа ранее уже появлялась в галерее, но для нее нет строки в таблице ТЙАМ5 с нулевым значением Сцз1ощег10, такую строку следует создать. Если такая строка уже имеется (это значит, что работа ни разу не была продана), ничего предпринимать не требуется. Первая задача пропедуры — получить данные нового произведения таз псевдотаблицы !пзейед.
Затем с помощью оператора 5ЕЕЕСТ подсчитывается количество строк в таблице ВОЙК, имеющих такие же значения атрибутов Атт!з110, Т!11е и Сору, Если это количество больше двух, значит, ранее произошла ошибка. Строк с такими данными должно быть максимум две — та, которая была изначально, ти новая. Если таких строк больше двух, триггер производит откат транзакции, выводит сообщение об ошибке и завершает работу. Есть обнаружено ровно две строки, это означает, что данная работа уже выставлялась в галерее ранее, и триггер отменяет транзакцию, удаляя только что добавленную в таблицу ВОЙК строку. Между прочим, в результате отката этой транзакции удаляются и те изменения, которые привели к срабатыванию триггера.
ВОВ 505 МВ ВОВ 505 530 525 0272!МВ 7117/1969 н 11711969 212711999 «171зю1 'Счг!лзю нн;ОО он цггцзко1нюоом В!50 26900 1500 6СОО !В!00 «коц> :коц 32101!97< 101!«!1Ви Н 121ГЖСО 3315ЛЯЮ «КОЦ> «МАС> «МА1> 16500 167СО !9750 17500 «коц> <НОЦ> <НО!.1 1015 !СО! 1О«О 1036 <М1Ц > <КЦА > КЦА > 17500 366СЮ 9ОСО 16000 37«О «МА1> «НОЦ' 101 " 121 122 -:- 126 129 130 1 ° ! ' 1 Рию.
13.24. Результат вставок из рис. 13.23 498 Глава 13. Работа с базами данных в 801 Вегуег 2000 Выполнив откат, триггер получает значение йГогК10 другой строки, содержащей Ланные этого произведения. Теперь ВуогК10 указывает либо на старую строку, если произведение уже выставлялось в галерее ранее, либо ца новую строку, если произведение появляется в галерее впервые. Единственное, что осталось сделать, — определить, имеется ли для этого произведения строка в таблице ТкАМ5 с нулевым значением Ецз1олСег10.
Если такая строка есть, то ничего предпринимать не требуется. В противном случае в таблицу ТКАМ5 необходимо вставить новую строку. На рис. 13.23 в базу данных У!емг К!С(йе добавляются два произведения. Первое из них никогда ранее не выставлялось в галерее, а второе уже успело побывать в ее стенах. На рис. 13.24 показаны таблицы УУОКК и ТйАМ5 после выполнения обеих вставок. для работы «1«1оггЬАуезг Ьу %КЬт» в таблицу уубкК была добавлена строка, а для копии 3512 5 работы «Музбс ЕаЬпс» — нет, потому что загшсь о ней уже имеется в базе данных.
(Мы знаем это потому, что с ней связана строка в таблице ТкАМ5 с Тгалзасбоп10 131.) Рис. 13.23. Операции вставки, приводящие к вызову триггера з листинге 13.4 В таблицу ТкАМ5 были добавлены две строки; внешние ключи были установлены ца правильные строки таблицы 990 кК. Обратите внимание также, что функция ОЕТОАТЕ() записывает в столбец Оа1еАсоц1гей не только лату, но и время.
Управление параллельной обработкой 499 Остальные значения в столбце Оа1еАсйпггед явно были заданы вручную, посколь- ку в них отсутствует время, ф',-)д~ хг Я33~!ФЯ22'.'Ы)3131 ! Ф~~:::9!«,.1~'.;~~1!Ъ"-;:~::;:.",;! .„,'=: 'АЗ,'1'-;,;:.: Представление, которое иным способом обновить невозможно, можно сделать обновляемым, определив для него замешаюший триггер. В этом случае 5Я1. 5егуег не будет пытаться выполнить операцию вставки, обновления или удаления, а вместо этого вызовет триггер.
Это требуется потому, что произволитель СУБД не в состоянии написать универсальный кол, выполняющий, к примеру, вставку в экземпляр произвольного представления. Зная же конкретное приложение, можно написать код, делающий это для представлений определенного вида. В этом разделе вы познакомились с основными функциями хранимых процедур и триггеров. Многое еще предстоит узнать, олнако приведенных здесь основ должно быть достаточно для начала. Из главы 15 вы узнаете, как вызывать хранимые процедуры с использованием интернет-технологий.
Управление параллельной обработкой ЯО1. 5егуег 2000 предоставляет исчерпывающий набор возможностей для управления параллельной обработкой. Количество вариантов выбора велико, и итоговое поведение определяется взаимодействием трех факторов: уровня изоляции транзакции, характеристик курсора и блокировочных полсказок, заданных в предложении 5ЕЕЕЕТ.
Блокировочное поведение зависит также от того, обра- 500 Глава 13. Работа о базами данных в 801 Вепгег 2000 Управление параллельной обработкой 501 Уровень изоляции транзакции В табл. 13.3 представлены возможностги управления параллельной обработкой. Самый обширный из них по количеству настроек — уровень изоляции транзакции. Возможные уровни изоляции перечислены в порядке возрастания ограничений в первой строке таблицы.
Это те самые четыре уровня, которые вы изучали в главе 11 и которые определены в стандарте 5С«1.-92. Обратите внимание, что в БОГ Вегчег можно разрешить «грязное» чтение, еслги установить уровень изоляции кЕАО ОИСОММ1ТТЕО («незаверпгенное чтение»). По умолчанию установлен уровень изоляции ЕЕАО СОММ1ТТЕО («завершенное чтение»). Таблица 13.3.
Варианты управления параллельной обработкой в 801 Вепгег Тип Охват Варианты Уровень изоляции транзакции неАО ОмсОмм!Тте0 неАО сОмм!тте0 НЕРЕАТАВ1Е НЕАО ЗЕН!АОЕАВ1Е НЕАО ОМ1-У О Рт! м ! ВТ! с ЗСН011 10СК НЕАОСОММ!ТТЕО неАООмсОммГтте0 НЕРЕАТАВ! ЕНЕАО ЗЕШАОЕАВ1Е Соединение— всв транзакции Характеристики курсора Курсор Блокировочныв подсказки ЗЕ1ЕСТ М0 10 С К НО!.О!.ОСК и другие... батывается ли курсор как часть транзакции, является ли оператор 5ЕСЕСТ частью курсора, и как подаются команды на обновление — из транзакции или независимо. В этом разделе мы обсудим только основы.
За дальнейшей информацией обращайтесь к документации по 5ОГ Вегуег 2000. В БОГ Вегуег блокировки не налагаются напрямую. Вместо этого разработчик указывает требуемую стратеги!о управления параллельной обработкой, и 3(21. Вегуег самостоятельно определяет, где налагать блокировки. Блокировки налагаются на строки, страницы, ключи, индексы, таблицы и даже на всю базу данных. 3(2Г 3егуег определяет необходимый уровень блокировки и может повышать или понижать его в ходе обработки.
Также Вьг(. Ьегуег определяет, когда налагать блокировку и когда снимать ее, в зависимости от предпочтений, сформулированных разработчиком. Следующим по возрастанию ограничений уровнем изоляции является ЕЕРЕАТАВСЕ ЕЕАО («воспроизводимое чтение»), при котором 3Я1 Вегуег налагает и удерживает блокировки всех строк, считываемых данной транзакцией. Это означает, что другие пользователи не могут изменить или удалить строку, которая была считана транзакцией, пока транзакция не будет зафиксирована или прервана. Повторное чтение курсора может, однако, привести к появлению фантомов.
Наиболее жестким уровнем изоляции является 5ЕЕГАС12АВСЕ («сериализуемость»). При нем 5ОГ Вегуег налагает блокировку на диапазон строк, считанных данной транзакцией. Тем самым гарантируется, что считанные данные не будут изменены или удалены и что в заблокированном диапазоне не будут вставлены новые строки, которые вызвали бы фантомное чтение. Обеспечение этого уровня изоляции обходится дороже всего, и его следует использовать только в тех случаях, когда он абсолютно необходим.
В качестве примера можно привести следующий 3(«)=оператор, который устанавливает уровень изоляции ЕЕРЕАТАВСЕ ЕЕАО: 5ЕТ ТЙЯИ5ЯСТ!ОИ 1501ЯТ!ОИ 1ЕНЕ1 ЕЕРЕЯТЯВСЕ ЕЕЯО Этот оператор можно вставить в любое место, где допускается применение ТВАГчГБАСТ-БЯГ, но до выполнения каких-либо действий с базой данных. Поведение курсора Второй способ объявления блокировочных предпочтений — задание поведения курсора (сигвог сопсштепсу). Возможны три варианта: только чтение (кЕАО ОИСУ), оптимистическая блокировка (ОРТ1М15Т? С) и пессимистическая блокировка (в 3Су 1. Ьегуег обозначается 5СкОСС 10СК).
Как говорилось в главе 11, при оптимистической стратегии блокировки никаких блокировок не налагается, пока пользователь не обновит данные. После этого, если ранее считанные данные были изменены. обновление отклоняется. Разумеется, прикладная программа должна указать, что нужно делать, когда происходит отказ в обновлении. 5СВОИ,СОСК представляет собой вариант пессимистической блокировки.
В этом случае при считывании любой строки на нее налагается блокировка обновления. Если курсор открывается из транзакции, блокировка удерживается до тех пор, пока транзакция не будет зафиксирована или отменена, Если курсор открывается вне транзакции, блокировка снимается при чтении следующей строки. Вспомните из главы 11, что одна блокировка обновлегпгя может воспрепятствовать другой блокировке обновления, но не коллективной блокировке.
Таким образом, в других соединениях эта строка может читаться при коллективной блокировке. Поведение курсора по умолчанию зависи~ от типа курсора (см. главу 11). Для статических и последовательных курсоров это только чтение, а для динамических и ключевых — оптимистическая блокировка. 502 Глава 13. Работа с базами данных в 80С Велгег 2000 Резервное копирование и восстановление 503 Поведение курсора задается с помощью оператора ОЕССАРЕ СОЙ50Й.