Devs Hive
Повернутися до всіх запитань

ACID - Consistency

ACIDMiddleSenior
Зустрічали на інтервʼю:1 користувач

Consistency (узгодженість) в ACID означає, що кожна транзакція переводить базу з одного валідного стану в інший валідний стан, не ломаючи правил і логіку системи.

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

Наприклад, замість того щоб валідувати дані на рівні сервісів ми можемо перенести валідацію в Constraints або Triggers.

DROP TABLE IF EXISTS accounts;

CREATE TABLE accounts (
id bigserial PRIMARY KEY,
owner text NOT NULL,
balance numeric(12,2) NOT NULL,
-- Замість того, щоб тримати валідацю в сервісах ми робимо це на рівні бази даних
-- Таким чином, ми узгоджуємо те, що balance не може бути меншим, ніж 0
CONSTRAINT accounts_balance_nonneg CHECK (balance >= 0)
);

INSERT INTO accounts(owner, balance) VALUES
('Alice', 50.00),
('Bob', 10.00);
-- Тепер пробуємо запустити транзакцію
BEGIN;

-- Хочемо зняти 100 у Alice, але в неї 50
-- Так як ми маємо Constraint, який забезпечує те що баланс не може бути меншим, ніж 0
-- При виконанні такої транзакції ми отримаємо ROLLBACK так як узгодженість даних була порушена
UPDATE accounts
SET balance = balance - 100
WHERE owner = 'Alice';

COMMIT;

Головне, що вам треба запамʼятати - це те що найбільш надійний спосіб забезпечити Consistency це використовувати правила, саме на рівні даних. Але тим не менше, зловживання нативними інструментами DB не завжди добре, так як веде до ускладнення системи. Тому в реальному житті, узгодження даних це завжди про компроміси між простотою і надійністю.

Зустрічав на інтервʼю?

Коментарі (0)

Увійдіть, щоб залишити коментар

Поки що немає коментарів. Будьте першим!