ACID - consistency
markdown
## ACID - Consistency
### Вступ
Якщо заглибитись в технічну реалізацію Consistency, то найбільш ефективний спосіб це зробити - перенести максимум правил на рівень бази даних, а не тримати їх на рівні бізнес логіки.
### Перенесення валідації на рівень бази даних
Наприклад, замість того щоб валідувати дані на рівні сервісів, ми можемо перенести валідацію в Constraints або Triggers.
```sql
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` не завжди добре, так як веде до ускладнення системи. Тому в реальному житті, узгодження даних це завжди про `компроміси` між простотою і надійністю.Short Answer
Interview readyPremium
A concise answer to help you respond confidently on this topic during an interview.