Проектування баз даних
48


двофазною фіксацією транзакцій та дуб­люванням даних. Ці два методи відрізняються тим, що в першому випадку багато транзакцій працюють одночасно з однією розподіленою базою да­них. У другому випадку кожна транзакція має змогу копіювати необхідні для її виконання дані з розподіленої бази даних і працювати з нею як зі своєю особистою базою даних, модифікувати ці дані, а потім після вико­нання транзакції повертати їх у розподілену базу даних.

Розглянемо підтримку транзакцій за допомогою механізму двофазної фіксаї^ії транзакції. При використанні цього методу транзакцію виконують у два етапи. Двофазна фіксація транзакцій спирається на такі правила.

1. Якщо хоча б один вузол не може з будь-яких причин зафіксувати транзакцію, то розподілена транзакція припиняється на всіх інших вузлах, які беруть участь у її виконанні.

2. Якщо всі вузли погоджуються з фіксацією транзакції, то вона фіксу­ється на всіх вузлах, які беруть участь в її реалізації.

Перший етап, чи перша фаза, полягає в тому, що на вузлі, де виконува­тимуть транзакцію, створюють процес-координатор, а на всіх інших вузлах — процеси-учасники. Спочатку процес-координатор розсилає пові­домлення учасникам про початок транзакції, і кожний з них самостійно ви­рішує, чи може транзакція бути завершеною на даному вузлі. Учасники, го­тові завершити транзакцію, надсилають повідомлення на вузол-координатор про свою готовність до завершення транзакції. Учасники, які не зможуть зафіксувати свою частину транзакції, надсилають повідомлення про те, що транзакцію буде перервано. Координатор, зібравши повідомлен­ня всіх учасників, вирішує долю транзакції згідно з правилами. Якщо всі учасники надіслали згоду, координатор надсилає повідомлення про гло­бальну фіксацію транзакції, згідно з яким вносяться зміни на всіх серверах. При відмові хоча б одного з учасників приймають рішення про припинення виконання транзакції і надсилають повідомлення про глобальне припинен­ня тим учасникам, які надіслали згоду на виконання транзакції. Тим учас­никам, які надіслали відмову на виконання транзакції, повідомлення можна не надсилати, оскільки вони самі в змозі прийняти рішення згідно з прави­лами двофазної фіксації транзакцій. Ця ситуація називається одностороннім припиненням виконання транзакції. В результаті на всіх серверах транзак­ція завершується однаково (фіксується або переривається). Якщо всі вузли мають змогу зафіксувати транзакцію, то всі перетворення виконують на всіх вузлах: якщо хоча б один вузол не в змозі зафіксувати результати тран­закції, то її припиняють на всіх вузлах і виконують відкіт.

Протоколом обслуговування транзакцій передбачається обмін повідом­леннями між координатором і учасниками двічі, тому цей механізм отри­мав назву двофазної фіксації транзакцій.

Механізм двофазного виконання транзакцій має ряд недоліків: одноча­сний захват всіх ресурсів може досить надовго заблокувати доступ до да­них; крім того, вихід з ладу під час виконання транзакції того вузла мережі. який заблокував ресурси, призведе до блокування деяких даних усієї мере­жі доти, поки не буде відновлено його роботу.

Основні проблеми, які можуть виникнути при двофазній фіксації тран­закцій — це забезпечення коректної поведінки системи в разі виходу з ладу сервера чи пошкодження ліній зв'язку. Тому організація розподіленої сис­теми в даному варіанті потребує досить надійних та швидких ліній зв'язку.

Іншою проблемою, яка досить часто виникає при такій організації підтримування транзакцій, є вирішення конфліктів, коли одна транзакція вступає в конфлікт з іншою транзакцією з приводу доступу до певних да­них. Тому системи, що базуються на двофазній фіксації транзакцій, по­винні мати якийсь механізм вирішення конфліктів, пов'язаних з одночас­ним доступом.

Другим механізмом підтримки роботи транзакцій є дублювання (тиражування) даних. Суть його полягає в тому, що необхідні для вико­нання транзакції дані копіюють на той сервер, де їх оброблятимуть. Усі зміни, внесені іншими користувачами протягом виконання запиту, не впли­вають на його виконання, оскільки вони фіксуються в основних файлах і не відображуються в їх копіях. Такий механізм дає змогу завершити транзакцію з ланцюжком пошукових запитів будь-якої довжини, не порушивши ло­гічної цілісності даних, а також є засобом уникання конфліктів під час ро­боти з базою даних. Наприклад, кілька користувачів можуть одночасно модифікувати одні й ті самі дані, не очікуючи один одного. Але коли зміне­ні дані будуть повернені в основну базу даних, то вона може мати кілька версій, тому для таких систем потрібен механізм управління версіями.

Після успішного завершення транзакції зміни вносять на всі сервери у відповідні файли, які брали участь у виконанні транзакції. При цьому вини­кає потреба якимось чином забезпечити синхронізацію процесу тиражуван­ня змін на різних серверах, щоб база даних не втратила своєї цілісності. Можливі два режими тиражування змін: синхронний і асинхронний.

Синхронний режгш тиражування змін — це процес, при якому зміни поширюються одразу по всіх вузлах після їх виконання. Синхронний варі­ант внесення змін слід використовувати в тих інформаційних системах, які повинні функціонувати в режимі реального часу. Прикладом таких систем може бути автоматизована банківська система, в якій зміни залишку рахун­ків повинні відображатись одразу, щоб не було можливості виконати з ни­ми якісь несанкціоновані дії. Цей варіант виконання транзакцій порівняно з їх двофазною фіксацією має деякі переваги. По-перше, запит виконують на одному сервері, при цьому не потрібно передавати дані і розподіляти вико­нання запиту між серверами. По-друге, хоч і потрібно тиражування змін даних, які виконала транзакція, то ці зміни вносять асинхронне щодо самої транзакції; отже, користувач отримує результат виконання запиту швидше, оскільки йому не потрібно очікувати закінчення обміну даними між серве­рами по внесенню змін. Іще одна важлива перевага синхронного тиражу­вання — підтримування «дзеркальної» бази даних на резервному сервері, причому обидва сервери (основний і резервний) в цьому випадку можуть працювати паралельно.