В галузі баз даних забезпечення цілісності та надійності даних є першочерговим завданням. Саме тут вступають у гру властивості ACID — атомарність (Atomicity), узгодженість (Consistency), ізольованість (Isolation) та довговічність (Durability). Кожна з цих властивостей відіграє важливу роль, але в цій статті ми зосередимося на "А" в ACID: атомарності. Давайте розглянемо, що таке атомарність, чому вона критично важлива і як вона працює на практиці, з реальними прикладами.
Зображення з FREEPIK
Що таке атомарність?
Атомарність — це основна властивість баз даних, яка гарантує, що транзакції обробляються як одна, неподільна одиниця. По суті, транзакція — це послідовність однієї або кількох операцій з базою даних — повинна бути повністю завершена або повністю скасована. Тут немає проміжного варіанту.
Цю властивість можна порівняти з поведінкою атома в фізиці: він неподільний за звичайних умов. Якщо якась частина транзакції зазнає невдачі, атомарність гарантує, що база даних повернеться до стану, в якому вона була до початку транзакції. Іншими словами:
- Усі запити в транзакції повинні успішно виконатися, щоб транзакція була зафіксована.
- Якщо один запит не вдасться, всі попередні успішні операції в межах транзакції будуть скасовані.
- Якщо система зламається або база даних зупиниться до того, як транзакція буде зафіксована, всі зміни, внесені транзакцією, будуть скасовані.
Дотримуючись цього принципу, атомарність забезпечує цілісність даних навіть у разі збоїв.
Чому атомарність критично важлива?
Важливість атомарності полягає в її ролі у підтримці узгодженості та надійності даних. Уявіть собі транзакцію бази даних як набір взаємопов'язаних операцій, що залежать одна від одної. Без атомарності часткове завершення транзакції може залишити базу даних в узгодженому стані, що спричинить каскадні помилки або корупцію даних.
Атомарність також спрощує обробку помилок для розробників. Покладаючись на базу даних для автоматичного скасування змін у разі невдачі, розробники можуть зосередитися на створенні надійних додатків без необхідності вручну реалізовувати складні механізми скасування.
Приклади атомарності на практиці
Приклад 1: Онлайн-банкінг
Розглянемо просту банківську операцію, коли ви хочете перевести $100 з рахунку А на рахунок B. Ця транзакція включає два етапи:
- Зняти $100 з рахунку A.
- Додати $100 на рахунок B.
Реалізація SQL:
BEGIN TRANSACTION;
-- Етап 1: Зняти $100 з рахунку A
UPDATE accounts
SET balance = balance - 100
WHERE account_id = 'A';
-- Етап 2: Додати $100 на рахунок B
UPDATE accounts
SET balance = balance + 100
WHERE account_id = 'B';
-- Зафіксувати транзакцію, якщо обидва етапи успішні
COMMIT;
-- Скасувати транзакцію, якщо хоча б один етап не вдався
ROLLBACK;
Атомарність гарантує, що обидва етапи або успішно виконуються разом, або обидва зазнають невдачі. Якщо система зламається після того, як з рахунку A знято $100, але до того, як кошти будуть додані на рахунок B, транзакція буде скасована, залишивши обидва рахунки незмінними. Без атомарності база даних може залишити $100 з рахунку A без відповідного кредиту на рахунку B, що призведе до фінансових невідповідностей (неузгодженості даних).
Приклад 2: Оформлення замовлення в електронній комерції
Коли клієнт робить замовлення на платформі електронної комерції, виконуються кілька операцій:
- Перевірка наявності товару.
- Зменшення кількості товару на складі.
- Списання суми з платіжного засобу клієнта.
4.
Записати деталі замовлення в базу даних.
Реалізація SQL:
BEGIN TRANSACTION;
-- Крок 1: Перевірити наявність товару (необов'язкова перевірка для ілюстрації)
SELECT stock
FROM inventory
WHERE product_id = 'P123';
-- Крок 2: Зняти кількість товару зі складу
UPDATE inventory
SET stock = stock - 1
WHERE product_id = 'P123';
-- Крок 3: Списати суму з рахунку клієнта (спрощено для ілюстрації)
INSERT INTO payments (customer_id, amount, status)
VALUES ('C456', 49.99, 'Pending');
-- Крок 4: Записати деталі замовлення
INSERT INTO orders (order_id, customer_id, product_id, quantity, status)
VALUES ('O789', 'C456', 'P123', 1, 'Confirmed');
-- Зафіксувати транзакцію, якщо всі кроки успішні
COMMIT;
-- Скасувати транзакцію, якщо хоча б один крок не вдався
ROLLBACK;
Якщо якийсь етап не вдається — наприклад, якщо платіжний метод відхилено — атомарність гарантує, що всі попередні успішні операції будуть скасовані. Кількість товару буде відновлено на складі, і в базі даних не залишиться неповного запису про замовлення.
Приклад 3: Збій бази даних під час транзакції
Уявімо, що база даних обробляє транзакцію, яка оновлює кілька рядків у таблиці. Перед тим, як транзакцію буде зафіксовано, сервер бази даних несподівано зламається. Атомарність гарантує, що жодні зміни, зроблені цією транзакцією, не будуть збережені. Коли база даних буде перезапущена, вона повернеться до стану, в якому була до початку транзакції.
Як досягається атомарність
Сучасні системи керування базами даних (DBMS) використовують різні механізми для забезпечення атомарності:
- Журнали транзакцій: DBMS веде журнали всіх операцій, виконаних під час транзакції. Якщо виникає помилка, журнал використовується для ідентифікації та скасування змін, зроблених неповною транзакцією.
- Механізми скасування: Багато DBMS впроваджують журнали скасування, що записують попередній стан даних до їх модифікації. У разі скасування транзакції журнал скасування використовується для відновлення початкового стану.
- Журнал запису попереднього (Write-Ahead Logging, WAL): Перед внесенням змін у базу даних, DBMS записує деталі змін у журнал. Це гарантує, що у разі збоїв журнал може бути використаний для скасування неповних транзакцій.
- Протокол двофазної коміти: У розподілених системах протокол двофазної коміти забезпечує атомарність через кілька баз даних. Це включає фазу підготовки, під час якої всі залучені системи погоджуються на коміт, і фазу коміту, коли зміни остаточно фіксуються.
Висновок
Атомарність є основою надійності баз даних, гарантуючи, що транзакції завершуються повністю або не виконуються взагалі. Обробляючи транзакції як неподільні одиниці, атомарність забезпечує цілісність даних, спрощує обробку помилок і підвищує надійність систем баз даних.
Чи ви керуєте фінансовими транзакціями, системами інвентаризації або будь-якими іншими критичними застосунками, розуміння та використання атомарності є важливим для побудови систем, яким можна довіряти. Впроваджуючи атомарність, ви не тільки зберігаєте узгодженість даних — ви також закладаєте основу для надійної та стійкої архітектури баз даних.
Перекладено з: Understanding Atomicity in Databases: The Indivisible Nature of Transactions