Архітектура журналу транзакцій

Структура SQL Server задовольняє вимогам АСШ в основному за рахунок використання послідовного журналу транзакцій, що гарантує живучість всіх транзакцій

Послідовність роботи з журналом транзакцій

Будь-яка операція модифікації даних проходить одну і ту ж послідовність дій: спочатку здійснюється запис в журнал транзакцій, а потім у файл даних У наступних розділах будуть описані всі дванадцять етапів, які проходить будь-яка транзакція

Початковий стан бази даних

Перед початком транзакції база даних знаходиться в цілісному стані Всі індекси заповнені і вказують на коректні рядка, а дані задовольняють всім правилам цілісності Кожен зовнішній ключ вказує на коректний первинний ключ

Деякі сторінки даних, найімовірніше, вже кешованими в память Додаткові сторінки даних та індексів копіюються в память в міру необхідності Отже, приступаємо до опису послідовності дій в транзакції

1 База даних знаходиться в цілісному стані

Команда модифікації даних

Транзакція ініціюється відправленим запитом, пакетом або збереженої процедурою, як показано на рис 515

2 Програмний код виконує команду BEGIN TRANSACTION Навіть якщо інструкція DML є відокремленою, тобто не вклавши в оболонку інструкцій, BEGIN TRANSACTION і COMMIT TRANSACTION, вона все одно обробляється як транзакція

3 У програмному коді виконується одна інструкція DML (INSERT, UPDATE або DELETE) або їх послідовність

Щоб проілюструвати роботу журналу транзакцій, в наступному коді ініціюється транзакція, після чого виконуються дві команди поновлення:

USE OBXKites

BEGIN TRANSACTION

UPDATE Product

SET ProductDescription = Transaction Log Test A,

DiscontinueDate = 12/31/2003

WHERE Code = 1001;

UPDATE Product

SET ProductDescription = Transaction Log Test B1, DiscontinueDate = 4/1/2003

WHERE Code = 4002;

Рис 515 Інструкції SQL DML обробляються в памяті як частина транзакції

Зверніть увагу на те, що транзакція не була підтверджена

4 План оптимізації запиту або генерується, або витягується з памяті Виконуються всі необхідні блокування, після чого в памяті виконуються всі операції модифікації даних, у тому числі поновлення індексів, розбиття сторінок і інші системні операції

У наступному розділі ми продовжимо нашу хронологічну екскурсію по транзакції

Виконання записи в журнал транзакцій

Найбільш важливим аспектом журналу транзакцій є те, що всі зміни даних записуються в нього і підтверджуються перед записом у файл даних (рис 516)

5 Зміни в даних записуються в журнал транзакцій

6 Усі записи DML підтверджуються в журналі транзакцій Це є фактичною гарантією того, що ці записи в журналі транзакцій дійсно існують

Рис 516 Команда COMMIT TRANSACTION запускає наступну вставку в журнап транзакцій

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

Підтвердження транзакції

Після того як послідовність завдань буде виконана, інструкція COMMIT TRANSACTION закриває транзакцію, і наступна транзакція отримує можливість запису в журнал (див рис 516)

7 Наступний код закриває транзакцію:

COMMIT TRANSACTION

Щоб побачити процес відправки транзакції в журнал, зверніться до ролика Transaction на сайті книги

8 Запис COMMIT вставляється в журнал транзакцій

9 Запис COMMIT підтверджується в журналі транзакцій (рис 517)

Рис 517 Перегляд підтверджених транзакцій в журналі за допомогою сторонньої програми ApexSQL Log

10 У фоновому режимі, коли зустрічається контрольна точка (внутрішнє подія SQL Server), процес lazy writer записує всі чорнові (модифіковані) сторінки даних у файл даних Цей процес намагається знайти послідовні сторінки, щоб прискорити запис Незважаючи на те що я згадую це дія під десятим номером, воно може відбутися практично в будь-який момент транзакції SQL Server отримує від операційної системи Windows повідомлення про завершення запису

Рис 518 Одним з останніх дій є запис змін у файл даних

Після успішного збереження транзакції в журналі транзакцій остання дискова операція записує зміни у файл даних (рис 518)

Оновлення файлу даних

11 На завершення фонової операції запису SQL Server позначає саму останню відкриту транзакцію в журналі Тепер всі підтверджені транзакції, записані у файл даних, підтверджені також і в журналі За допомогою команди DBCC Орепи-Тгап можна побачити саму останню відкриту транзакцію

Завершення транзакції

Отже, описана послідовність дій пройшла повний цикл, і база даних повернулася в цілісний стан

12 База даних повернулася в цілісний стан

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

Відкат в журналі транзакцій

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

Відновлення журналу транзакцій

Основною перевагою журналу транзакцій є те, що він підтримує властивість атомарности транзакцій у разі системного збою

Якщо SQL Server перестає функціонувати, журнал транзакцій автоматично перевіряється, як тільки сервер знову включається в роботу Все відбувається так, як описано нижче

■ Якщо в журналі містяться які-небудь операції DML, які не були підтверджені, вони відкочуються

Для тестування цієї властивості потрібно набратися хоробрості Почніть транзакцію і до її закінчення вимкніть живлення сервера Звичайне закриття аналізатора запитів не замінить цього, оскільки він запросить дозвіл на завершення очікують транзакцій і в разі отримання негативної відповіді від користувача відкотить їх Якщо зупинити SQL Sever звичайним чином, то перед фактичним остановом він завершить всі очікують завдання Тому, щоб побачити на власні очі процес відновлення журналу транзакцій, вам доведеться відключити компютер від мережі

Якщо слідувати описаної вище послідовності дій, то сервер слід відключити безпосередньо перед п 7 У цьому випадку записи в журналі транзакцій будуть ідентичні показаним пізніше на рис 5110 SQL Server плавно відновиться після збою і відкотить все незавершені транзакції

■ Якщо в журналі транзакцій існують записи про операції DML, які підтверджені, але не відзначені як записані в файл даних, вони будуть записані у файл даних при відновленні Цю функцію практично неможливо продемонструвати

Джерело: Нільсен, Пол Microsoft SQL Server 2005 Біблія користувача : Пер з англ – М: ООО ІД Вільямс , 2008 – 1232 с : Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*