Что такое ACID в SQL?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
ACID — это акроним, описывающий набор свойств транзакций в системах управления базами данных, гарантирующий их надежность и целостность данных.
-
Atomicity (Атомарность): Транзакция либо выполняется полностью, либо не выполняется вовсе. Если какая-либо часть транзакции завершается с ошибкой, все изменения, внесенные в рамках этой транзакции, откатываются до исходного состояния.
BEGIN TRANSACTION; -- Начало транзакции -- Операции, которые должны быть выполнены как одно целое UPDATE accounts SET balance = balance - 100 WHERE account_id = 1; INSERT INTO transactions (account_id, amount) VALUES (1, -100); COMMIT; -- Подтверждение транзакции, если все успешно -- ROLLBACK; -- Откат транзакции в случае ошибки -
Consistency (Согласованность): Транзакция переводит базу данных из одного согласованного состояния в другое. Все ограничения целостности (первичные ключи, внешние ключи, уникальные ограничения) сохраняются.
-- Пример нарушения согласованности: попытка вставить запись с дублирующимся уникальным ключом INSERT INTO users (user_id, email) VALUES (1, 'test@example.com'); -- Если пользователь с user_id = 1 уже существует и user_id - уникальный ключ, эта операция вызовет ошибку INSERT INTO users (user_id, email) VALUES (1, 'another@example.com'); -
Isolation (Изолированность): Выполнение одной транзакции не влияет на выполнение других параллельных транзакций. Каждая транзакция видит базу данных так, как будто она единственная, работающая с ней. Существуют различные уровни изоляции (Read Uncommitted, Read Committed, Repeatable Read, Serializable), влияющие на видимость изменений другими транзакциями.
-- Пример: Две транзакции читают и обновляют одни и те же данные -- Транзакция 1: BEGIN TRANSACTION; SELECT balance FROM accounts WHERE account_id = 1; -- Чтение 1 -- Задержка UPDATE accounts SET balance = balance + 50 WHERE account_id = 1; COMMIT; -- Транзакция 2 (параллельно): BEGIN TRANSACTION; SELECT balance FROM accounts WHERE account_id = 1; -- Чтение 2 -- Задержка UPDATE accounts SET balance = balance - 30 WHERE account_id = 1; COMMIT; -- Уровень изоляции влияет на то, какое значение balance увидит каждая транзакция -
Durability (Надежность): После успешного завершения транзакции (commit) внесенные изменения являются постоянными и не будут потеряны даже в случае сбоев системы (например, отключения питания).
-- После COMMIT; изменения записываются на надежное хранилище (например, диск) COMMIT; -- Даже при последующем сбое, изменения, внесенные этой транзакцией, будут сохранены