ACID - consistency
ACID - Узгодженість (Consistency)
Вступ
Якщо заглибитись в технічну реалізацію узгодженості, то найбільш ефективний спосіб це зробити - перенести максимум правил на рівень бази даних, а не тримати їх на рівні бізнес логіки.
Перенесення валідації на рівень бази даних
Наприклад, замість того щоб валідувати дані на рівні сервісів, ми можемо перенести валідацію в 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 не завжди добре, так як веде до ускладнення системи. Тому в реальному житті узгодження даних - це завжди про компроміси між простотою і надійністю.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.