Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции БДиСУБД.docx
Скачиваний:
15
Добавлен:
19.11.2019
Размер:
494.91 Кб
Скачать

Изолированность(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).Еслитранзакциябылаотменена,значит,этаверсия-мусор,которыйследуетудалить.Еслижеимеетсянескольковерсий,сделанныхподтвержденнымитранзакциями,тоактуальнойсчитаетсяверсияснаибольшимидентификаторомтранзакций.Остальныеверсиисчитаютсяустаревшимиитакжеподлежатудалению.

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

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

  • Активнаятранзакция-транзакция,котораястартовала,ноещенезавершена.

  • Заинтересованнаятранзакция-этотранзакция,конкурирующаястекущейтранзакцией.

  • Старейшаяактивнаятранзакция-этотакаяактивнаятранзакция,котораястартовалараньшедругих.Илииначе,этоактивнаятранзакцияснаименьшимидентификатором.

  • Старейшаязаинтересованнаятранзакция-этотакаязаинтересованнаятранзакция,котораястартовалараньшедругих.Илииначе,этозаинтересованнаятранзакцияснаименьшимидентификатором.

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