Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Принципы ACID
ACID — это фундаментальные принципы гарантирования надёжности и консистентности базы данных. Это аббревиатура, каждая буква обозначает отдельный принцип.
A — Atomicity (Атомарность)
Атомарность — это гарантия того, что транзакция либо выполняется полностью, либо вообще не выполняется. Нет промежуточных состояний.
Пример:
Представьте перевод денег со счёта A на счет B:
public void transferMoney(Account fromAccount, Account toAccount, BigDecimal amount) {
begin();
try {
fromAccount.withdraw(amount);
toAccount.deposit(amount);
commit();
} catch (Exception e) {
rollback();
}
}
Если произойдёт ошибка между операциями, обе откатываются. Деньги не исчезают и не дублируются.
C — Consistency (Консистентность)
Консистентность — это гарантия, что база данных переходит из одного валидного состояния в другое валидное состояние. Все бизнес-правила и ограничения соблюдаются.
Примеры ограничений:
ALTER TABLE users ADD PRIMARY KEY (id);
ALTER TABLE users ADD UNIQUE (email);
ALTER TABLE orders ADD FOREIGN KEY (user_id) REFERENCES users(id);
ALTER TABLE accounts ADD CHECK (balance >= 0);
БД сама проверяет консистентность:
Если попытаться нарушить FOREIGN KEY, база откажет:
INSERT INTO orders (user_id, amount) VALUES (999, 100);
-- ERROR: Нет пользователя с id=999!
I — Isolation (Изоляция)
Изоляция — это гарантия, что одновременные (параллельные) транзакции не мешают друг другу. Результат одной транзакции не влияет на другую.
Уровни изоляции (от слабого к сильному):
Connection conn = dataSource.getConnection();
// READ_UNCOMMITTED — совсем нет изоляции
conn.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
// READ_COMMITTED — стандартный
conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
// REPEATABLE_READ — повторяемое чтение
conn.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
// SERIALIZABLE — полная изоляция
conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
D — Durability (Долговечность)
Долговечность — это гарантия, что как только транзакция подтверждена (commit), данные сохранятся навсегда, несмотря на системные сбои.
Как БД гарантирует долговечность:
- Write-Ahead Logging (WAL) — запись в лог перед записью в основную БД
- Fsync — синхронизация данных на диск
- Репликация — копирование данных на другие серверы
statement.execute("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
conn.commit(); // <- Данные гарантированно на диске
Bез долговечности данные могут быть потеряны при сбое сервера.
Взаимодействие принципов
public void complexTransaction() {
try {
conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
conn.setAutoCommit(false);
begin();
Account from = getAccountForUpdate(1);
Account to = getAccountForUpdate(2);
if (from.getBalance() < 100) {
throw new InsufficientFundsException();
}
from.setBalance(from.getBalance() - 100);
to.setBalance(to.getBalance() + 100);
saveAll(from, to);
commit();
} catch (Exception e) {
rollback();
}
}
Заключение
ACID — это основа надёжных баз данных:
- A (Atomicity) — всё или ничего
- C (Consistency) — правила соблюдаются
- I (Isolation) — не мешаем друг другу
- D (Durability) — данные вечны
SQL-базы (PostgreSQL, MySQL, Oracle) полностью поддерживают ACID. NoSQL БД часто жертвуют некоторыми принципами для скорости и масштабируемости.