- •Введение.
- •Лекция1.Введениевклиент-серверныеСубд.
- •InterbaseSqlServer.Общиесведения.
- •Платформы
- •Типыприложений
- •ФайлыбазыданныхInterBase
- •Лекция3.Триггерыихранимыепроцедуры
- •Хранимыепроцедуры(StoredProcedures)
- •Терминаторы
- •Заголовок
- •Телопроцедуры
- •Блоккодапроцедуры
- •Операторприсваивания
- •УсловныйоператорIf…then…else
- •ОператорSelect
- •ЦиклForselecTиSuspend
- •ЦиклWhile…do
- •ОператорыInsert,update,delete
- •ОператорExecuteprocedure
- •Исключения
- •СобытияиоператорPost_event
- •Измененияиудаленияхранимыхпроцедур
- •Примерысозданияивызовахранимыхпроцедур
- •Генераторы
- •Увеличениешагагенератора
- •Триггеры
- •ПеременныеNeWиOld
- •Реализацияавтоинкрементныхключевыхполей
- •Лекция4.Транзакции.Механизмтранзакций
- •Атомарность(Atomicity)
- •Согласованность(Consistency)
- •Изолированность(Isolation)
- •Устойчивость(Durability)
- •Неявныйиявныйстарттранзакций
- •Кактранзакцияработает
- •Уровниизолированноститранзакций
- •Параметрытранзакций
- •Компонентыдоступакданнымивизуальныекомпоненты МеханизмыдоступакБд
- •ПроблемырусскихбукввInterBase
- •Лекция5. Основы языка php. Функции php для работы с субд ИсторияPhp
- •ВозможностиPhp
- •Основнойсинтаксис
- •Разделениеинструкций
- •Комментарии
- •Переменные,константыиоператоры
- •Переменные
- •Константы
- •Операторы
- •Типыданных
- •Типboolean(булевилилогическийтип)
- •Типinteger(целые)
- •Типfloat(числасплавающейточкой)
- •Типstring(строки)
- •Одинарныекавычки
- •Двойныекавычки
- •Типarray(массив)
- •Определениеприпомощиarray()
- •Определениеспомощьюсинтаксисаквадратныхскобок
- •Типobject(объекты)
- •Типresource(ресурсы)
- •Решениезадачи
- •Построениеинтерфейсадлядобавленияинформации
- •Установкасоединения
- •Выборбазыданных
- •Получениеспискаполейтаблицы
- •Отображениеспискаполейвhtml-форму
- •Записьданныхвбазуданных
- •Отображениеданных,хранящихсявMySql
- •Заключение
Изолированность(Isolation)
Вбазеданныхможетвыполнятьсямножествотранзакцийодновременно.Бывает,чтодве,иболеетранзакциипытаютсяизменитьоднуитужезапись.Чтобыгарантироватьцелостностьданных,транзакциивыполняютсяизолированнодруготдруга.Можносказать,чтокаждаятранзакцияработаетсосвоейкопией(версией)данных.Существуетнесколькостепенейизолированноститранзакций,очемдалеемыпоговоримподробней.
Устойчивость(Durability)
Еслитранзакциязавершаетсяуспешно,изменения,сделанныевееконтексте,должныбытьустойчивымиисохранятся,независимоотошибоквдругихтранзакциях,ошибокоборудованияилиаварийногозавершенияработысервера.Другимисловами,результатыработыуспешнозавершеннойтранзакциифизическисохраняютсявбазеданных.
Неявныйиявныйстарттранзакций
Вседействиянадбазойданных,совершаемыевклиентскомприложении,происходятвнутри(вконтексте)транзакции.Впримерахпредыдущихлекциймысоединяликлиентскиеприложениясбазойданных,вообщенеиспользуяникакихтранзакций.Однакоэтонезначит,чтоихнебыло.Простотранзакциизапускалисьнеявно,автоматически.Причемспараметрами,созданнымиDelphi"поумолчанию".ВсерьезныхприложенияхБДэтонедопустимо,таккакможетпривестикмногочисленнымконфликтам.
Транзакциюможностартоватьиявно.Изстандартныхмеханизмовдоступамыбудемиспользовать,восновном,InterBaseExpress(IBX).Вприложениидолженприсутствоватькакминимум,одинкомпонентIBTransaction.Спомощьюэтогокомпонентаможноявноуказатьпараметрытранзакции,управлятьстартом,подтверждениемилиоткатомтранзакции.Делаетсяэтоспомощьюследующихметодовкомпонента:
StartTransaction-Старттранзакции.
Commit-Подтверждениетранзакцииспоследующимеезакрытием.
CommitRetaining-Подтверждениетранзакциибезеезакрытия.
Rollback-Откаттранзакцииспоследующимеезакрытием.
RollbackRetaining-Откаттранзакциибезеезакрытия.
Впрочем,компонентыдоступакданнымнеявнопроизводятзапусктранзакции,поэтомуStartTransactionобычнопропускают.Авотподтверждениеилиоткаттранзакциипроверяют,какправило,вблокеtry…exceptвклиентскомприложении:
try
//какиетодействиянадданными...
IBTransaction1.Commit;//подтверждаем
Except
//произошлаошибка
ShowMessage('Невозможновыполнитьоперацию!');
IBTransaction1.Rollback;//делаемоткаттранзакции
end;//try
Вданномпримере,еслитранзакцияпрошлауспешно,тоданныенормальносохраняются.Вслучаекакой-тоошибкивыводитсясообщение,итранзакцияоткатывается.
Кактранзакцияработает
Вбазеданныхимеетсяспециальнаяобласть,котораяназываетсяTIP(TransactionInventoryPage-ИнвентарнаяСтраницаТранзакций).Пристартетранзакции,ейприсваиваетсяидентификатор(TID,TransactionID)-инвентарныйномер,которыйсохраняетсявTIP.Приэтомусамойпоследнейтранзакциибудетнаибольшийидентификатор.ВTIP,помимономерастартовавшейтранзакции,сохраняетсяиеесостояние,котороеможетбытьActive(Вработе),Committed(Подтвержденная),RolledBack(Отмененная,откат)иInLimbo(Неопределенная).
Активнойназываетсятранзакция,котораявнастоящиймоментвыполняется.
Подтвержденнойназываетсятранзакция,котораяуспешнозавершиласвоюработу,какправило,покомандеCommit.
Отмененнойназываюттранзакцию,котораязавершиласьнеудачно.Приэтомпроизводитсяоткатсделанныхейдействий,какправило,командойRollBack.
Неопределеннойтранзакцией(Limbo)называюттранзакцию,котораяработаетодновременносдвумяилиболеебазамиданных.Призавершениитакойтранзакции,InterBaseсовершаетдвухфазноеподтверждениеCommit,гарантируя,чтоизменениябудутвнесенылибововсеБД,либониводну.Приэтомподтверждениявбазахданныхбудутдаватьсяпоочереди.Есливэтовремявозникнетсбойсистемы,томожетполучиться,чтовкакихтоБДизменениябылисделаны,авкакихтонет.Приэтомтранзакцияпереходитвнеопределенноесостояние,когдасервернезнает,следуетлиподтвердитьэтутранзакцию,илиоткатить.
Каждаятранзакция,начинаяработу,создаетсобственнуюверсиюзаписейтаблиц,скоторымиработает.Версиязаписи-этокопиязаписи,котораясоздается,когдатранзакцияпытаетсяееизменить.Такимобразом,каждаязаписьтаблицыпотенциальноможетиметьмножествоверсий,приэтомкаждаятранзакцияработаетссобственнойверсиейэтойзаписи.Еслитранзакцияменяетданные,тоонаменяетихвсобственнойверсиизаписи,аневоригинале.Далеетранзакцияможетлибоподтвердиться,либоотмениться.
Еслитранзакцияподтвердилась,InterBaseпопытаетсяпометитьпредыдущуюоригинальнуюзапись,какудаленную,аверсиюзавершеннойтранзакции-какоригинал.КогдаInterBaseсохраняетизменения,товновуюзаписьпомещаетсяиидентификатортранзакции,котораявнеслаэтиизменения(любаястрокатаблицысодержитидентификаторсоздавшейеетранзакции).
Еслитранзакциязавершиласьнеуспешно,оригиналзаписитакиостаетсяоригиналом.
Еслижетранзакциятолькочитаетзапись,непытаясьееизменить,тодлянеенесоздаетсясобственнойверсии.
Однакомогутвозникатьиконфликтытранзакций.Предположим,чтостартовалатранзакцияТ1.Онасоздалаверсиюзаписи,ипоменялаееданные.ВэтовремястартовалаконкурирующаятранзакцияТ2,исоздалаверсиютойжезаписи.ПосколькуТ1ещенезавершилась,Т2пристартенемоглавидетьизмененияданных,сделанныеТ1,азначит,создаласвоюверсиюизстарогооригинала.ТеперьТ1завершаетработупоCommit.КакдолженпоступитьInterBase?ЕслионпометитверсиюзаписиТ1какоригинал,астаруюзапись,какудаленную,товверсииТ2окажутсяложныеданные!ДействияInterBaseвэтомслучаебудутзависетьотпараметровэтихтранзакций,очемнижемыпоговоримподробней.
Еслитранзакцияудаляеткакую-тостроку,тострокафизическинеудаляетсяизбазыданных,алишьпомечается,какудаленная,сохраняяиномерудалившейеетранзакции.Вслучаееслитранзакциязавершенанеудачно,реальногоудалениястрокинепроисходит,таккакнебылоподтверждения.
Такимобразом,говорят,чтоInterBaseимеетмноговерсионнуюархитектуру(MGA-MultiGenerationArchitecture).Такаяархитектурапозволяеторганизоватьработусбазойданныхтак,чтобычитающиепользователинеблокировалипишущих.Крометого,привозникновениисбоеввсистеме,InterBaseоченьбыстровосстанавливается,благодаряименноMGA.Кстати,InterBaseявляетсяпервымSQL-сервером,которыйподдерживаетмноговерсионнуюархитектуру.
Нарядуспреимуществамитакогоподхода,вбазеданныхсовременемнакапливается"мусор".Каждаятранзакция,пытающаясяизменитьданные,создаетсобственныеверсиистрок,иеслинепозаботитьсяосвоевременномудалениистарых,уженикомуненужныхверсий,тобазаданныхвскоребудетпростозабитамусором.
Нокакудалятьмусор?Можнолиудалитьверсиютранзакции,котораязавершилась,удачноилинеудачно?Нет,еслиэтаверсиявнастоящиймоментиспользуетсядругимитранзакциями.Позжемыпоговоримобуровняхизолированноститранзакций,покалишьскажем,чтонекоторыетранзакциимогутвидетьизменения,сделанныедругими,ещенеподтвержденнымиактивнымитранзакциями.
Предположим,чтостартовалатранзакцияТ1.Этатранзакциясоздалаверсиюзаписиимодифицировалаее.ПозжестартовалатранзакцияТ2,котораянастроенатак,чтобывидетьвсеизмененияданных,даженеподтвержденные.Онаобратиласьктойжезаписи,апосколькуонажелаетвидетьпоследниеизменения,ейпредоставляютверсиютранзакцииТ1.ЗатемТ1завершиласвоюработу,ноТ2покаещеработаетсееверсиейзаписи,следовательно,этуверсиюудалятьнельзя.
ВInterBaseприсутствуетмеханизмудалениястарыхверсий,которыйзапускаетсяновымитранзакциями.Новаятранзакция,запрашиваязапись,считываетвсеверсииэтойзаписи.Приэтомделаетсяпроверканато,былалитранзакция,сделавшаяэтуверсию,отменена(RollBack)илиподтверждена(Commit).Еслитранзакциябылаотменена,значит,этаверсия-мусор,которыйследуетудалить.Еслижеимеетсянескольковерсий,сделанныхподтвержденнымитранзакциями,тоактуальнойсчитаетсяверсияснаибольшимидентификаторомтранзакций.Остальныеверсиисчитаютсяустаревшимиитакжеподлежатудалению.
Такимобразом,молодыетранзакцииприбираютбазуданныхотмусора,оставленногоболеестарымитранзакциями.Ночистятониневсестарыеверсииподряд,атольковерсиитойзаписи(илизаписей),ккоторойобращаютсясами.
Посколькунасервереодновременноможетвыполнятьсямножествотранзакций,имеетсятерминологияопределенияэтихтранзакций.
Активнаятранзакция-транзакция,котораястартовала,ноещенезавершена.
Заинтересованнаятранзакция-этотранзакция,конкурирующаястекущейтранзакцией.
Старейшаяактивнаятранзакция-этотакаяактивнаятранзакция,котораястартовалараньшедругих.Илииначе,этоактивнаятранзакцияснаименьшимидентификатором.
Старейшаязаинтересованнаятранзакция-этотакаязаинтересованнаятранзакция,котораястартовалараньшедругих.Илииначе,этозаинтересованнаятранзакцияснаименьшимидентификатором.
Вданномконтексте,сборкоймусоразанимаетсястарейшаяактивнаятранзакция.Таккакверсийзаписи,сделанныхболеемолодымитранзакциями,онавидетьнеможет,тоубираетмусор,оставленныйещеболеестарымитранзакциями.Когдаэтатранзакциязаканчиваетсвоюработу,тостатус"старейшейактивной"переходиткдругойтранзакции.Такимобразом,транзакциипередаютдругдругуобязанностьпосборкемусора.