Skip to main content
Практика завдань

ACID - consistency

ACID - Узгодженість (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);

Виконання транзакції

Тепер пробуємо запустити транзакцію:

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

Висновок

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

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.

Дочитали статтю?
Практика завдань